UE4 在當前遊戲模組新增一個新的模組

liuzhimu2018發表於2020-11-18

問題引入

在學習UE4官方教程 ,“塔防遊戲“遇到了要在當前模組新增一個新的遊戲載入模組
在網上找了些文件後做個步驟總結

1, 首先在專案檔案下->Source 新增一個要新增的模組資料夾,如:TowerGameLoadingScreen
2, 在第一步資料夾下新增一個Private資料夾,一個Public資料夾,還有個 <模組名>.Build.cs檔案 如:TowerGameLoadingScreen.Build.cs
3, 開啟TowerGameLoadingScreen.Build.cs檔案新增如下的程式碼:
// Copyrigth 1998-2020 Epic Games, Inc. ALL Rigths Reserved.

using UnrealBuildTool;

// This moudle must be loaded "PreLoadScreen" in the .uproject file, otherwise it will not hook in time!
public class TowerGameLoadingScreen : ModuleRules
{
    public TowerGameLoadingScreen(ReadOnlyTargetRules Target) : base(Target)
    {
        PrivatePCHHeaderFile = "Public/TowerGameLoadingScreen.h";
        PCHUsage = PCHUsageMode.UseSharedPCHs;

        PublicDependencyModuleNames.AddRange(
            new string[]{
                "Core",
                "CoreUObject",
                "Engine",
            }
        );

        PrivateDependencyModuleNames.AddRange(
            new string[] {
                "MoviePlayer",
                "Slate",
                "SlateCore",
                "InputCore",
            }
        );
    }
}

該檔案裡定了這個模組引用的其他模組,預編譯的標頭檔案,還可以定義要引用的一些私有的標頭檔案,和公有的標頭檔案

4,Public和Private檔案下分別新增一個 <模組名>.h, <模組名>.cpp 如:

TowerGameLoadingScreen.h
TowerGameLoadingScreen.cpp

5,開啟上一步建立的.h 和.cpp 檔案新增如下程式碼

TowerGameLoadingScreen.h

// Copyright 1998-2020 Epic Game, Inc. All Rights Reserved.

#pragma once

#include "Engine.h"
#include "Modules/ModuleInterface.h"	// 這裡要這樣引用否則引用不到

/** Module interface for the game`s loading screens */
class ITowerGameLoadingScreenModule : public IModuleInterface
{
public:
    /** Kicks off the loading screen for in game loading (not startup) */
    virtual void StartInGameLoadingScreen() = 0;
};

TowerGameLoadingScreen.cpp

// Copyright 1998-2020 Epic Games, Inc. All Rights Reserved.

#include "TowerGameLoadingScreen.h"

// This module must be loaded "PreLoadingScreen" in the .uproject file, otherwise it will not hook in time !

class FTowerGameLoadingScreenModule : public ITowerGameLoadingScreenModule
{
public:
    
    virtual void StartupModule() override
    {
        
    }

    virtual bool IsGameModule() const override
    {
        return true;
    }

    virtual void StartInGameLoadingScreen() override
    {

    }
};

// 這個地方根據官方文件要這樣使用,用於UBT來自動搜尋模組,編譯新增DLL檔案
IMPLEMENT_GAME_MODULE(FTowerGameLoadingScreenModule, TowerGameLoadingScreen)
6, 開啟<專案名>.uproject,找到Modules中新增你的模組如:
	"Modules": [
		{
			"Name": "MyTower",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
				"Engine",
				"CoreUObject",
				"AIModule",
				"Slate",
				"SlateCore"
			]
		},
		{
			"Name" : "TowerGameLoadingScreen",
			"Type" : "Runtime",
			"LoadingPhase": "PreLoadingScreen"
		}
	],
7,以上步驟完成並儲存後,右擊<專案名>.uproject 選擇Generate Visual Studio project file
8, 開啟Vs就可以看到你新加的模組了,這個時候你進行編譯是不會編譯你新加的模組的,要在<主專案模組>.Build.cs中新增對這個模組的引用如下:
// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class MyTower : ModuleRules
{
	public MyTower(ReadOnlyTargetRules Target) : base(Target)
	{
		PrivateDependencyModuleNames.AddRange(
            new string[] {
                "TowerGameLoadingScreen"
            }
            );
	}
}

在進行編譯就可以編譯新加的模組了,這個是因為這個模組不是UBT的目標,在主模組進行引用後,UBT就會找到這個模組並進行編譯(我猜的_)。

相關文章