2023年4月17日发(作者:牛老板下载)UE4控制台命令使⽤
UE4控制台命令使⽤
官⽅⽂档
请先⾷⽤官⽅⽂档,再阅读本⽂。
1. 概览
UE4 对⾃定义内置的控制台命令提供了多种⽀持,如下图进⾏简单的汇总。
控制台变量和控制台命令应该尽早的注册给引擎(最好是全局变量),这样引擎才能提供控制台输⼊⾃动提⽰的功能,以及帮助⽂本
的显⽰
Exec 接⼝是不提供⾃动提⽰和帮助⽂本的⽀持
UObject 的 exec 标记⽀持⾃动提⽰ 但是没有帮助⽂本
2. 控制台变量
控制台变量官⽅⽂档说的很详细,下⾯只补充⼏个不太好理解的点
2.1 加载控制台变量
2.1.1
这是唯⼀⼀个允许加载标记为ECVF_Cheat的cvars的ini⽂件。当编译UE_BUILD_SHIPPING或UE_BUILD_TEST时,这个⽂件不会加载。
这个⽂件主要是⽅便开发⼈员在启动是指定作弊变量,避免每次都要把这些变量在控制台输⼊⼀遍。
这个⽂件可屁股长痣代表什么
以放在⼯程的Config⽬录
[Startup]
=1
2.1.2 其他加载⽅式
在项⽬ 中使⽤
; 游戏的系统设置
[SystemSettings]
= 2
; 带编辑器情况下的系统设置 覆盖[SystemSettings]的值
[SystemSettingsEditor]
= 3
使⽤其他配置来指定,可以在配置编辑器中设置
UPROPERTY(config, EditAnywhere, Category=Optimizations, meta=(
ConsoleVariable="PassMovable",DisplayName="Movables in early Z-pass",
ToolTip="是否在早Z阶段渲染可移动对象。需要重新加载关卡!"))
uint32 bEarlyZPassMovable:1;
2.2 ⽤法⽰例
static TAutoConsoleVariable CVarTest(
TEXT(""),
TEXT("1"),
TEXT("⽤来测试"),
ECVF_Cheat
);
void test()
{
FString var = ueOnGameThread();
}
控制台变量的修改,是可以注册⼀个回调来检测的,但是不推荐这么⽤。⽤法官⽅有说明。
3. 控制台命令
控制台命令是可以在控制台输⼊命令,然后执⾏⼀个回调。
// 回调只带有⼀个 world 参数
FAutoConsoleCommandWithWorld
// 回调带有⼀个World 和 ⽤户输⼊的参数
FAutoConsoleCommandWithWorldAndArgs
// 回调带有⼀个World 和 ⽤户输⼊的参数 和 ⼀个输出设备
FAutoConsoleCommandWithWorldArgsAndOutputDevice
3.1 ⽰例
以 这个为例,读者可根据实际情况选⽤不同的类型。
FAutoConsoleCommandWithWorldArgsAndOutputDevice
static FAutoConsoleCommandWithWorldArgsAndOutputDevice CCommandTest(
TEXT("d"),
TEXT("⽤来测试命令⾏")
TEXT("arg: arg1 敌⼈数量"),
FConsoleCommandWithWorldArgsAndOutputDeviceDelegate::CreateLambda(
[](const TArray& argList, UWorld* w, FOutputDevice& out){
if (() != 1)
{
(ELogVerbosity::Type::Error, TEXT("参数不对,需要1个参数"));
return;
}
int32 enemyNum = FCString::Atoi(*argList[0]);
// todo ...
(ELogVerbosity::Log, TEXT("设置敌⼈数量成功, %d"), enemyNum);
}),
ECVF_Cheat
);
3.2 在运⾏时注册存在的问题以及解决办法
问题: 对于控制台命令,有时候希望能够绑定⼀个对象的⽅法,这就需要运⾏时注册。但是运⾏时注册控制台变量有个问题就是,⽆法使
⽤在控制避孕套广告
台⾃动提⽰的功能风寒风热感冒
,帮助提⽰也没有。
解决办法是对 进⾏⼀下封装。
FAutoConsoleCommandWithWorldArgsAndOutputDevice
struct FMyAutoCmd
{
public:
FMyAutoCmd(const TCHAR* Name, const TCHAR* Help, uint32 flags)
{
m_cmd = MakeShared(
Name,
Help,
FConsoleCommandWithWorldArgsAndOutputDeviceDeleg金和木
ate::CreateLambda(
[this](const TArray& argList, UWorld* w, FOutputDevice& out) { m_eIfBound(argList, w, out); })
);
}
FConsoleCommandWithWorldArgsAndOutputDeviceDelegate& getDelegateRef()
{
return m_myDelegate;
}
private:
FConsoleCommandWithWorldArgsAndOutputDeviceDelegate m_myDelegate;
TSharedPtr m_cmd;
};
static FMyAutoCmd CCo两德
mmandMyTest(
TEXT("Cmd"),
TEXT("⽤来测试命令⾏")
TEXT("arg: arg1 敌⼈数量"),
ECVF_Cheat
);
void ATestGameModeBa::initConsolCmd()
{
egateRef().BindWeakLambda(
this,
[this](const TArray& argList, U对联手抄报
World* w, FOutputDevice& out) {
if (() != 1)
{
(ELogVerbosity::Type::Error, TEXT("参数不对,需要1个参数"));
return;
}
i公共场所英语
nt32 enemyNum = FCString::Atoi(*argList[0]);
this->tEnemyNumber(enemyNum);
(ELogVerbosity::Log, TEXT("设置敌⼈数量成功, %d"), enemyN抗过敏
um);
});
}
void ATestGameModeBa::tEnemyNumber(int32 number)
{
// todo
}
封装之后,既可以保证⾃动提⽰的功能正确,⼜可以动态的绑定回调。
4. Exec 接⼝
Exec接⼝是⼀种⽐较原始的⽅式,没有提供⾃动提⽰和帮助提⽰。
struct FTestExec
: public FSelfRegisteringExec
{
virtual bool Exec(class UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar) override
{
if (FPar::Command(&Cmd, TEXT("testExec")))
{
FString arg1 = FPar::Token(Cmd, fal);
(ELogVerbosity::Log, TEXT("arg1 : %s"), *arg1);
FString value;
if (FPar::Value(Cmd, TEXT("value="), value))
{
(ELogVerbosity::Log, TEXT("value=%s"), *value);
}
return true;
}
return fal;
}
};
static FTestExec execTest;
5. UObject
5.1 默认⽀持的对象
UObject 可以把某个函数标记为可执⾏
UFUNCTION(exec)
然后可以直接在控制台输⼊命令 和 参数 执⾏
默认只有以下对象⽀持这个功能:
UPlayerInput
APlayerController
APawn
AHUD
AGameModeBa
UCheatManager
AGameStateBa
APlayerCameraManager
UCLASS()
class TESTREFCET_API ATestRefcetGameModeBa : public AGameModeBa
{
GENERATED_BODY()
public:
UFUNCTION(Exec)
void testUfunction(int32 value);
};
引擎是在 UPlayer::Exec 中对这些默认⽀持的对象进⾏处理的
5.2 如何给其他对象加⼊这个功能
UCLASS()
class TESTREFCET_API ATestGameModeBa
: public AActor
, public FSelfRegisteringExec
{
GENERATED_BODY()
public:
UFUNCTION(Exec)
void testUObjectExec(int32 value);
virtual bool Exec(class UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar) override
{
bool bReturnVal = fal;
if (GetClass()->GetDefaultObject() != this)
{
bReturnVal = ProcessConsoleExec(Cmd, Ar, NULL);
}
return bReturnVal;
}
};
UObjectProcessConsoleExec
提供了⼀个 函数来处理被标记 Exec 的函数, 只要有⼀个合适的时机调⽤这个函数处理输⼊的命令即可。
6. 关卡蓝图中的事件调⽤
在控制台中输⼊ 便可提⽰出所有的事件
ce