2Bbear's knowledge workshop

추가 : 

Error - 이런 식으로 Custom Module을 만들 경우 Hot reload가 되지 않는 문제점이 발견되었다. Ue4 Ver 21

//

내가 원하는 것은 UE4 에디터 상에서 정리 가능한 C++ 코드 폴더를 만들어 내는 것이다.

이 컨텐츠 브라우저 Classes 안에 새로운 폴더를 만들고 싶은 것이다.

그렇게 하기 위해서는 모듈이라는 것을 만들어야 한다. 모듈에 대한 자세한 설명은 생략한다. 플러그인과 헷갈리지는 말자.


모듈 제작의 규칙

1. 모듈의 이름과 동일한 폴더

2. 모듈의 빌드 규칙 파일 : 모듈이름.Build.cs 로 만들어져 있어야한다.

3. 프리컴파일드 헤더와 소스파일 : 모듈이름.h , 모듈이름.cpp 로 만들어져야 한다.


모듈 제작 순서


1. 폴더를 만들어준다.

내부에 모듈 이름에 맞는 Build.cs 와 cpp, h를 만들어준다.



1-1 cpp , h, build파일에 코드를 작성한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
 
using UnrealBuildTool;
using System.Collections.Generic;
 
public class TankGameEditorTarget : TargetRules
{
    public TankGameEditorTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Editor;
        //ExtraModuleNames.Add("TankGame");
        ExtraModuleNames.AddRange(new string[] { "TankGame""TankCodes" });
    }
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
 
using UnrealBuildTool;
using System.Collections.Generic;
 
public class TankGameTarget : TargetRules
{
    public TankGameTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;
        //ExtraModuleNames.Add("TankGame");
        ExtraModuleNames.AddRange(new string[] { "TankGame","TankCodes"});
    }
}
 
cs






2. 프로젝트 target파일과 프로젝트 Editor.target.cs 파일 두곳에 모듈을 추가해 준다.


보통 프로젝트 폴더 soruce 폴더 하위에 있을 것이다....버전마다 달라질 수 있을 것 같긴한데. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//WebServerGameTank.Target.cs
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
 
using UnrealBuildTool;
using System.Collections.Generic;
 
public class WebServerGameTankTarget : TargetRules
{
    public WebServerGameTankTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;
        ExtraModuleNames.Add("WebServerGameTank");
        ExtraModuleNames.Add("TankCodes");
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//WebServerGameTankEditor.Target.cs
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
 
using UnrealBuildTool;
using System.Collections.Generic;
 
public class WebServerGameTankEditorTarget : TargetRules
{
    public WebServerGameTankEditorTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Editor;
        ExtraModuleNames.Add("WebServerGameTank");
        ExtraModuleNames.Add("TankCodes");
    }
}
 
cs

d



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Fill out your copyright notice in the Description page of Project Settings.
 
using UnrealBuildTool;
 
public class TankCodes : ModuleRules
{
    public TankCodes(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
 
        PublicDependencyModuleNames.AddRange(new string[] { "Core""CoreUObject""Engine" });
 
        PrivateDependencyModuleNames.AddRange(new string[] { });
    }
}
 
cs


클래스 이름과 생성자 이름이 바뀐다는 것에 주의하자. 



3. uproject 파일을 메모장을 열어 Name과 Type을 추가한다.

연결프로그램으로 메모장을 이용하여 수정하면 되고, 이 코드를 보니 Json인거 같은데.



4. 비쥬얼 스튜디오에서 솔루션 빌드 후 에 uproject파일을 우클릭하여 Generate Visual Studio project files를 실행한다.



비쥬얼 스튜디오에 폴더가 추가되어 있음을 확인 할 수 있다. 


5. 에디터에 모듈 폴더를 추가하기 위해서, 에디터를 실행시켜 더미 클래스를 만들어준다. 

여전히 추가가 안되어 있는 상태


신기하게 모듈 선택지에 새로 추가한 모듈 이름이 보인다. 해당 이름을 선택한 뒤에 클래스를 생성하면, 5:5 확률로 실패하거나 성공할 수 있는데 이 결과에 굳이 연연하지 말자, 우리가 필요한 것은 단순히 ui로 보이는 코드가 작성되는 것이다.


만약 여기서 None class로 생성한 경우 안될 수도 있으니 AActor를 선택하여 dummy를 만들어 주자.




6. 에디터를 닫는다. 비쥬얼 스튜디오를 다시 킨 뒤 다시 솔루션 빌드(rebuild solution)를 실행시킨다.

이때는 솔루션 빌드가 성공해야한다.


7. 다시 에디터를 켜서 모듈이 추가된 것을 확인한다.