목차

     

     


     

     

     

     
    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로 보여준다.