Plugins
  Example
    ButtonCommand.h .cpp
Example.Build.cs

ExampleConsoleCommand.h .cpp 
ExampleDebuggerCategory.h .cpp
ExampleModule.h .cpp
StaticMesh_Detail.h .cpp
Source
    Utilities
    CHelper.h
CLog.h .cpp
    Global.h
CStaticMesh.h .cpp
.Build.cs
    .uproject
 

 

 

 

 

툴바 만들기

 

 


 

 

CPC-949 (MBCS)  vs.  euc-kr (Unicode)

 

한글은 아스키코드의 줄바뀜 문자(\n) 뒤에 위치해있기 때문에

한글을 줄바꿈 문자로 간주한다.

 

 

CPC-949 (MBCS, Multi-Byte Character Set) 

  • 1 byte는 1 byte로 처리. 2 byte는 2 byte로 처리. 
  • Unreal
  • Visual Studio의 기본설정. 바꿀 수 있다.

 

euc-kr (Unicode)

  • 무조건 2 byte로 처리

 

OpenFileDialogA 는 1byte

OpenFileDialogW는 2byte. 한글사용 가능

 

 

 

 

Visual Studio 내에서의 문자 설정


 

 

 

Example.Build.cs

 

Example.Build.cs

더보기
using UnrealBuildTool;
public class Example : ModuleRules
{
public Example(ReadOnlyTargetRules Target) : base(Target) //public은 외부에 공개
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicIncludePaths.Add(ModuleDirectory);
PublicDependencyModuleNames.Add("Core");
PrivateDependencyModuleNames.Add("U2212_05"); //본인 모델은 private
PrivateDependencyModuleNames.Add("CoreUObject");
PrivateDependencyModuleNames.Add("Engine");
PrivateDependencyModuleNames.Add("Slate");
PrivateDependencyModuleNames.Add("SlateCore");
PrivateDependencyModuleNames.Add("GameplayDebugger");
PrivateDependencyModuleNames.Add("DesktopPlatform");
PrivateDependencyModuleNames.Add("MainFrame");
PrivateDependencyModuleNames.Add("EditorStyle");//추가
}
}

추가

  • PrivateDependencyModuleNames.Add("EditorStyle"); 

 


 

 

 

ButtonCommand

 

ButtonCommand.h

더보기
#pragma once
#include "CoreMinimal.h"
#include "Framework/Commands/Commands.h"
class EXAMPLE_API FButtonCommand
: public TCommands<FButtonCommand>
{
public:
FButtonCommand();
~FButtonCommand();
public:
void RegisterCommands() override;
public:
TSharedPtr<FUICommandList> Command;
public:
TSharedPtr<FUICommandInfo> LoadMesh;
private:
void OnClicked_LoadMesh();
};

변수 추가

  • TSharedPtr<FUICommandInfo> LoadMesh;

 

함수 추가

  • OnClicked_LoadMesh();

 

 

 

ButtonCommand.cpp

더보기
#include "ButtonCommand.h"
FButtonCommand::FButtonCommand()
: TCommands("ToolBar_Buttons", FText(), NAME_None,FEditorStyle::GetStyleSetName())//ToolBar_Buttons는 총괄 객체의 이름
{
Command = MakeShareable(new FUICommandList());
}
FButtonCommand::~FButtonCommand()
{
if (Command.IsValid())
Command.Reset();
}
void FButtonCommand::RegisterCommands()
{
#define LOCTEXT_NAMESPACE ""
UI_COMMAND(LoadMesh, "LoadMesh", "", EUserInterfaceActionType::Button, FInputChord());//버튼, 체크박스, 라디오버튼 등 원는 방식으로 버튼을 만들어준다.
#undef LOCTEXT_NAMESPACE
Command->MapAction(LoadMesh, FExecuteAction::CreateRaw(this, &FButtonCommand::OnClicked_LoadMesh));//LoadMesh실행을 위해 OnClicked_LoadMesh를FExecuteAction::CreateRaw으로 연결해준다.
}
void FButtonCommand::OnClicked_LoadMesh()
{
GLog->Log("OnClick");
}

 

 


 

 

 

ExampleModule.h .cpp

 

ExampleModule.h 

더보기
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
class FExampleModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
private:
TSharedPtr<class FExampleConsoleCommand> ConsoleCommand;
private:
TSharedPtr<FExtender> Extender;//확장을 위한 Extender
private:
void AddToolBar(class FToolBarBuilder& InBuilder);//버튼을 추가하는 역할
};

변수 추가

  • TSharedPtr<FExtender> Extender;

 

함수 추가

  • void AddToolBar(class FToolBarBuilder& InBuilder);

 

 

 

ExampleModule.cpp

더보기
#include "ExampleModule.h"
#include "ExampleDubuggerCategory.h"
#include "ExampleConsoleCommand.h"
#include "StaticMesh_Detail.h"
#include "ButtonCommand.h"
#include "U2212_05/CStaticMesh.h"
#include "GameplayDebugger.h"
#include "LevelEditor.h"
#define LOCTEXT_NAMESPACE "FExampleModule"
IMPLEMENT_MODULE(FExampleModule, Example)//모듈의 시작점을 알려준다.
void FExampleModule::StartupModule()
{
//Debugger
{
IGameplayDebugger::FOnGetCategory category;
category.BindStatic(&FExampleDubuggerCategory::MakeInstance);
IGameplayDebugger::Get().RegisterCategory("Example", category, EGameplayDebuggerCategoryState::EnabledInGameAndSimulate, 5); //5번 슬롯 할당
IGameplayDebugger::Get().NotifyCategoriesChanged();
}
//Console Command
{
ConsoleCommand = MakeShareable(new FExampleConsoleCommand());
}
//Property Editor - StaticMeshActor
{
FOnGetDetailCustomizationInstance instance; //싱글톤
instance.BindStatic(&FStaticMesh_Detail::MakeInstance);//Bind로 묶어준다.//StaticMeshActor_Detail.h에서 static으로 만든 MakeInstance 사용.
FPropertyEditorModule& prop = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
prop.RegisterCustomClassLayout(ACStaticMesh::StaticClass()->GetFName(), instance);
}
//ToolBar(=ButtonCommand)
{
FButtonCommand::Register();
Extender = MakeShareable(new FExtender());//Extender 생성
FToolBarExtensionDelegate toolBar;
toolBar.BindRaw(this, &FExampleModule::AddToolBar);//toolBar와 AddToolBar를 연결
Extender->AddToolBarExtension("Compile", EExtensionHook::Before, FButtonCommand::Get().Command, toolBar);
FLevelEditorModule& levelEditor = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");//LevelEditorModule을 불러온다.
levelEditor.GetToolBarExtensibilityManager()->AddExtender(Extender);//levelEditor에 Extender를 추가
}
}
void FExampleModule::ShutdownModule()
{
if (IGameplayDebugger::IsAvailable())
IGameplayDebugger::Get().UnregisterCategory("Example");
if (ConsoleCommand.IsValid())
ConsoleCommand.Reset(); //스마트포인터를 제거할 수 있도록 Reset()을 콜 해준다. 자동화가 문제가 되는경우가 있으므로 넣어준다.
}
void FExampleModule::AddToolBar(FToolBarBuilder& InBuilder)
{
FString name = TEXT("메시");
InBuilder.AddSeparator(); //언리얼 에디터 툴바의 구분선(|)
InBuilder.AddToolBarButton
(
FButtonCommand::Get().LoadMesh,
"LoadMesh", //InExtensionHook
FText::FromString(name), //InLabelOverride
FText::FromString("Load Mesh Data") //InToolTipOverride
);
}
#undef LOCTEXT_NAMESPACE

StartupModule에 ToolBar(=ButtonCommand) 생성

  • Extender 생성

 

함수 정의

  • AddToolBar(FToolBarBuilder& InBuilder)

 

 

 

툴바에 한글을 사용하고 싶은 경우

해당 솔루션 파일의 .cpp를 다른 이름으로 인코딩하여 저장한다. 그 후에 빌드를 진행한다.

 

해당 작업들을 먼저 한 후에 빌드를 진행한다.

 


 

 

실행화면

 

언리얼 에디터 상에 '메시' 버튼이 생성되었다.

'메시'버튼을 누르면 출력 로그에 OnClick이 출력된다.

 


 

 

 

 

언리얼 에디터 상의 설정

 

 


 

 

에디터 개인설정 - UI 익스텐션 포인트 디스플레이

 

에디터 개인설정 - Developer Tools - UI 익스텐션 포인트 디스플레이

체크를 한다고 바로 적용되어 보이지 않는다. Unreal Editor를 종료 후 다시 열어준다.

 

 

위와 같이 초록색 글자로 버튼 커멘드를 TEXT로 보여준다.