FCommandLine
是 UE 封装的启动参数的管理类,在 Launch
模块下的 FEngineLoop::PreInit
中被初始化 (FCommandLine::Set
) 为程序启动的 CmdLine
。FCommandLine
支持 Append
和Parser
这是比较常用的功能,但是今天要说的是另外一个:CommandLine 的白名单和黑名单模式。
考虑这样的需求:在游戏开发阶段,有很多参数可以在启动时配置,方便测试,但是在发行时需要把启动时从命令行读取配置的功能给去掉,强制使用我们设置的默认参数。
OVERRIDE_COMMANDLINE_WHITELIST
怎么才是最简单的办法?其实这一点根本不需要自己去处理这部分的内容,因为 FCommandLine
支持白名单模式。
开启的方法为在 target.cs
中增加 WANTS_COMMANDLINE_WHITELIST
宏:
1 | GlobalDefinitions.Add("WANTS_COMMANDLINE_WHITELIST=1"); |
如果只开启这个,则默认情况下不允许接收任何外部传入的参数,但具有默认的参数 -fullscreen /windowed
。
当然,我们可以自己指定这个 WHITLIST
,那么就是在target.cs
中使用 OVERRIDE_COMMANDLINE_WHITELIST
宏:
1 | GlobalDefinitions.Add("OVERRIDE_COMMANDLINE_WHITELIST=\"-arg1 -arg2 -arg3 -arg4\""); |
这样就只有我们指定的这些参数才可以在运行时接收,防止玩家恶意传递参数导致游戏出错。
这部分的代码是写在 Misc/CommandLine.cpp 中的。
Example:
1 | // target.cs |
这里只指定了 -e
/-c
两个参数,如果程序在启动时被指定了其他的参数,如:
1 | D:/UnrealEngine/EngineSource/UE_4.21_Source/Engine/Binaries/Win64/UE4Launcher.exe -e -c -d |
在 FCommandLine::Get()
只能得到 -e
和-c
,-d
和 exe 路径都被丢弃了,只能用在指定开关,不能用来传递值。
FILTER_COMMANDLINE_LOGGING
还可以在 target.cs
中指定 FILTER_COMMANDLINE_LOGGING
来控制对 FCommandLine::LoggingCmdLine
的过滤:
1 | GlobalDefinitions.Add("FILTER_COMMANDLINE_LOGGING=\"-arg1 -arg2 -arg3 -arg4\""); |
它会在程序从命令行中接收的参数中过滤所指定的参数,类似于参数的黑名单。
Example:
1 | GlobalDefinitions.Add("WANTS_COMMANDLINE_WHITELIST=1"); |
在运行时传入参数:
1 | D:/UnrealEngine/EngineSource/UE_4.21_Source/Engine/Binaries/Win64/UE4Launcher.exe -e -c -d |
得到的是:
1 | -D:/UnrealEngine/EngineSource/UE_4.21_Source/Engine/Binaries/Win64/UE4Launcher.exe -d |
-e
和 -c
被过滤掉了。