UE4中Target.cs、Build.cs的区别
冇奶油
2022年02月17日 03:07

UnrealBuildTool(UBT)是UE4中用于辅助编译的工具,它可以协助引擎生成相应的makefile,Build.cs和Target.cs都需要使用这个工具。


Build.cs

UE4中的所有模块都需要包含一个[模块名].Build.cs文件,该文件的代码格式差不多长下面这样:

代码块
C#
自动换行
复制代码
using UnrealBuildTool;

public class SimpleWindow : ModuleRules
{
	public SimpleWindow(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
		
		PublicIncludePaths.AddRange(
			new string[] {
				// ... add public include paths required here ...
			}
			);
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"Projects",
				"InputCore",
				"UnrealEd",
				"ToolMenus",
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
	}
}
复制成功

[模块名].Build.cs的作用就是通过让UBT告诉编译器这个模块需要依赖哪些其他的模块,从而让该模块能够找到所需模块的.dll文件。

Public和Private的区别

PublicDependecy中所包含的模块能够让其他包含该模块的模块也能够使用(感觉好绕...),意思就是如果模块A在PublicDependecy中包含了模块B,那么当模块C包含模块A的时候也能够1同时包含模块B。

PrivateDependecy中所包含的模块则只有当前模块可以看见,包含该模块的模块看不见。

Paths和Names的区别

其实就是一个添加模块的路径,一个添加模块的名字。


Target.cs

代码块
C#
自动换行
复制代码
using UnrealBuildTool;
using System.Collections.Generic;

public class MyProject2Target : TargetRules
{
	public MyProject2Target( TargetInfo Target) : base(Target)
	{
		Type = TargetType.Game;
       //还有下面几种类型
       //Type = TargetType.Editor; 
       //Type = TargetType.Client;
       //Type = TargetType.Server; 
		DefaultBuildSettings = BuildSettingsVersion.V2;
		ExtraModuleNames.AddRange( new string[] { "MyProject2" } );
	}
}
复制成功

Type = TargetType.xxx对应不同的.exe类型(比如你是用的DebugGame Editor还是DebugGame来构建项目)。

我使用的4.27版本默认包含一个Editor.cs和一个Target.cs,区别就是Type不一样。

和Build.cs不同,不是所有模块都需要有Target.cs,Target.cs文件默认创建在Source文件夹下面,和游戏模块放在一起。游戏模块就是Source下面的那些文件夹,默认的那个和项目同名的就是游戏的主模块。同样的这些模块也包含了[模块名].Build.cs文件。Target.cs文件的作用是控制项目输出不同的.exe时能够包含不同的游戏模块。例如:有游戏模块A、B、C,可以在Editor下包含A、B模块,而其他模式下包含A、C模块。


总结

Build.cs的作用是解决模块与模块间的依赖关系,而Target.cs解决的是输出的可执行文件中应该包含哪些模块的问题。而实现这些功能靠的都是UE4中的UBT工具。

从逻辑上来说,Target.cs的层级是高于Build.cs的。

参考:

https://unrealcommunity.wiki/build.cs-hv582z08

https://baemincheon.github.io/2021/04/07/difference-between-build-cs-and-target-cs/

《大象无形:虚幻引擎程序设计浅析》——罗丁力 & 张三