언리얼 엔진에서 플러그인은 엔진의 기능을 확장하는 모듈식 구성요소이다. 사용자 정의 플러그인을 생성하여 새로운 기능을 추가하거나 기존 기능을 수정할 수 있으므로 개발자가 특정 요구 사항에 맞게 엔진을 조정할 수 있다. 커스텀 플러그인을 만들 때 모듈식 디자인의 모범 사례를 따르고 언리얼 엔진의 프로그래밍 규칙을 준수하는 것이 중요하다. 

 

목차

     

     


     

     

     

     
    Plugins
      Example
        Example.Build.cs
    ExampleModule.h .cpp
    ExampleDebuggerCategory.h .cpp 생성
     

     

     

     

     

    Slate UI

     

    언리얼 엔진에서 커스텀 플러그인을 만들기

    1. 언리얼 에디터를 열고 "플러그인" 메뉴로 이동한다.
    2. "새 플러그인"을 클릭하고 생성할 플러그인 유형을 선택한다.
    3. 플러그인의 이름과 위치를 선택하고 "플러그인 만들기"를 클릭한다.
    4. 소스 코드 디렉토리를 포함하여 기본 파일 및 폴더 세트로 플러그인이 생성된다.
    5. 소스 코드 디렉토리에서 새 C++ 클래스 또는 블루프린트 스크립트를 생성하여 플러그인용 새 모듈을 생성한다.
    6. 모듈의 소스 코드 또는 Blueprint 스크립트에서 플러그인의 기능을 정의한다.
    7. 소스 코드 또는 Blueprint 스크립트를 컴파일하여 플러그인을 빌드한다.
    8. 플러그인이 빌드되면 언리얼 엔진 프로젝트에 추가할 수 있는 별도의 모듈로 패키징 및 배포할 수 있다.

    커스텀 플러그인을 만들 때 모듈식 디자인의 모범 사례를 따르고 언리얼 엔진의 프로그래밍 규칙을 준수하는 것이 중요하다. 

     


     

     

    모듈화

     

    Lib (static Library)

    • 프로그래밍의 일부분이 되어 똑같은 메모리 공간을 사용한다.

     

    DLL (Dynamic Link Library)

    • 별도의 메모리 공간을 사용한다. Map 단위를 DLL로 만들 수도 있다.
    • 해당 경우, 점검 시 해당 맵만 멈춰놓고(=얼려놓고) 점검할 수 있다.

     

     


     

     

    Slate UI

     

    Game    
    private Module ← (X) Project
    public Module ← (O)

     

     


     

     

    UMG vs. Slate UI

     

    UMG게임에서 뜨는 UI

     

    Slate UIEditor에 뜨는 UI

     


     

     

    EVerbosity

     

    https://docs.unrealengine.com/4.26/en-US/API/Runtime/Core/Logging/ELogVerbosity__Type/

     

    ELogVerbosity::Type

    Enum that defines the verbosity levels of the logging system.

    docs.unrealengine.com

     


     

     

     

     

     

     

    프로젝트 & 플러그인 

     


     

    새 프로젝트 생성

     

     


     

     

    새 플러그인 만들기

     

     

    Plugins > Example

    • Binaries: Plugin용 DLL이 컴파일 되어 들어가있다.
    • Content: 에셋용. 게임 런타임쪽 들어갈 리소스.
    • Resource: 파일을 직접적으로 사용. ex. 이미지, 사운드 파일.
    • .uplugin: plugin 엔진 설정.

     

     


     

     

     

     

    Plugin 코드

     

    UObject로부터 상속받지 않는 모든 Class는 F를 붙인다.  ex. FExampleModule

     


     

    ExampleBuild.cs

     

    Game    
    private Module ← (X) Project
    public Module ← (O)

     

     

    ExampleBuild.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("CoreUObject");
            PrivateDependencyModuleNames.Add("Engine");
            PrivateDependencyModuleNames.Add("Slate");
            PrivateDependencyModuleNames.Add("SlateCore");
            PrivateDependencyModuleNames.Add("GameplayDebugger");
        }
    }

     

    PrivateDependencyModuleNames (List<String>)

    • List of private dependency module names. These are modules that our private code depends on but nothing in our public include files depend on.

     


     

     

    ExampleModule

     

    ExampleModule.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "Modules/ModuleManager.h"
    
    class FExampleModule : public IModuleInterface
    {
    public:
    	virtual void StartupModule() override;
    	virtual void ShutdownModule() override;
    };

     

     

    ExampleModule.cpp

    더보기
    #include "ExampleModule.h"
    #include "ExampleDubuggerCategory.h"
    
    #include "GameplayDebugger.h"
    
    #define LOCTEXT_NAMESPACE "FExampleModule"
    
    IMPLEMENT_MODULE(FExampleModule, Example)//모듈의 시작점을 알려준다.
    
    void FExampleModule::StartupModule()
    {
    	IGameplayDebugger::FOnGetCategory category;
    	category.BindStatic(&FExampleDubuggerCategory::MakeInstance);
    
    	IGameplayDebugger::Get().RegisterCategory("Example", category, EGameplayDebuggerCategoryState::EnabledInGameAndSimulate, 5); //5번 슬롯 할당
    	IGameplayDebugger::Get().NotifyCategoriesChanged();
    }
    
    void FExampleModule::ShutdownModule()
    {
    	if (IGameplayDebugger::IsAvailable())
    		IGameplayDebugger::Get().UnregisterCategory("Example");
    }
    
    #undef LOCTEXT_NAMESPACE

     


     

     

    ExampleDebuggerCategory

     

    새 C++ 클래스 - ExampleDebuggerCategory 생성

     

     

     

    ExampleDebuggerCategory.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "GameplayDebuggerCategory.h"
    
    class EXAMPLE_API FExampleDubuggerCategory
    	: public FGameplayDebuggerCategory
    {
    public:
    	FExampleDubuggerCategory();
    	~FExampleDubuggerCategory();
    
    public:
    	static TSharedRef<FGameplayDebuggerCategory> MakeInstance();
    
    public:
    	void CollectData(APlayerController* OwnerPC, AActor* DebugActor) override;
    };

     

     

    ExampleDebuggerCategory.cpp

    더보기
    #include "ExampleDubuggerCategory.h"
    #include "GameFramework/Character.h"
    #include "GameFramework/PlayerController.h"
    
    FExampleDubuggerCategory::FExampleDubuggerCategory() { }
    
    FExampleDubuggerCategory::~FExampleDubuggerCategory() { }
    
    TSharedRef<FGameplayDebuggerCategory> FExampleDubuggerCategory::MakeInstance()
    {
    	return MakeShareable(new FExampleDubuggerCategory());
    }
    
    void FExampleDubuggerCategory::CollectData(APlayerController * OwnerPC, AActor * DebugActor)
    {
    	FGameplayDebuggerCategory::CollectData(OwnerPC, DebugActor);
    
    	//GLog->Log(OwnerPC->GetPawn()->GetName());
    
    	//if (!!DebugActor)
    	//	GLog->Log(DebugActor->GetName());
    }

     

     

     

    프로젝트 세팅 - 게임플레이 디버거 - Add Ons - 카테고리

    • 0번에 Example이 들어왔다.
    • 아래의 Override Slot Idx를 체크하면 Slot Idx를 바꿀 수 있다.

     

     

     

    실행화면

     

     

     

     


     

     

    '⭐ Unreal Engine > UE Plugin - Basic' 카테고리의 다른 글

    [UE] Plugin (Save StaticMesh & RenderData, LOD)  (0) 2023.04.12
    [UE] Plugin (StaticMesh Detail)  (0) 2023.04.07
    [UE] StaticMesh  (0) 2023.04.06
    [UE] Console Command  (0) 2023.04.05
    [UE] Console, DrawDebugLine  (0) 2023.04.04