【UE4/UE5】在虚幻引擎中创建控制台指令的几种方法

大家好,我是key。

在使用 Unreal Engine 做开发的时候,我们经常需要一些"隐藏指令"来调试,比如快速生成一个物体、打印日志、或者修改某些运行参数。UE 本身就支持自定义 控制台指令(Console Command),而且方式不止一种。下面我总结了几种常见做法,大家可以根据需求来选。


1. 使用 FAutoConsoleCommand

这是最常见、最简单的方式,写一个全局变量就能自动注册。

比如我们用指令"MyGame.Hello"来演示,

cpp 复制代码
#include "Engine/Engine.h"
#include "HAL/IConsoleManager.h"

// 简单指令
static FAutoConsoleCommand MyTestCommand(
    TEXT("MyGame.Hello"),    //命令
    TEXT("Print a hello message"),    //描述
    FConsoleCommandDelegate::CreateLambda([]()
    {
        if (GEngine)
        {
            GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Hello from console!"));
        }
    })
);

// 带 World 的指令
static FAutoConsoleCommandWithWorld MyWorldCommand(
    TEXT("MyGame.SpawnCube"),    //如上
    TEXT("Spawn a cube in world"),
    FConsoleCommandWithWorldDelegate::CreateLambda([](UWorld* World)
    {
        if (World)
        {
            World->SpawnActor<AActor>(AActor::StaticClass(), FVector::ZeroVector, FRotator::ZeroRotator);
        }
    })
);

用法:在控制台输入

bash 复制代码
MyGame.Hello MyGame.SpawnCube

2. 使用 IConsoleManager::RegisterConsoleCommand

如果你是写插件或者模块,通常会在 StartupModule() 里注册指令。

cpp 复制代码
// 在模块 StartupModule 里
IConsoleManager::Get().RegisterConsoleCommand(
    TEXT("MyGame.DynamicCommand"),
    TEXT("Dynamic command example"),
    FConsoleCommandDelegate::CreateRaw(this, &FMyModule::MyCommandHandler),
    ECVF_Default
);

3. Exec 函数

在某些类里(比如 PlayerController、GameInstance)你可以重写 Exec,自己解析指令。

cpp 复制代码
bool AMyPlayerController::Exec(UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar)
{
    if (FParse::Command(&Cmd, TEXT("MyCustomCommand")))
    {
        UE_LOG(LogTemp, Log, TEXT("MyCustomCommand executed!"));
        return true;
    }
    return Super::Exec(InWorld, Cmd, Ar);
}

输入:

bash 复制代码
MyCustomCommand

4. CheatManager + UFUNCTION(exec)

这是最常见的"作弊指令"写法,非常适合快速调试。

cpp 复制代码
UCLASS()
class UMyCheatManager : public UCheatManager
{
    GENERATED_BODY()

public:
    UFUNCTION(exec)
    void KillAllEnemies()
    {
        UE_LOG(LogTemp, Log, TEXT("All enemies killed!"));
    }
};

控制台输入:

KillAllEnemies


5. 蓝图里用 exec

如果你写蓝图函数的时候加上 UFUNCTION(exec),同样能在控制台调用。不过这一点大多数人不太常用,一般还是在 C++ 里写比较方便。

总结

  • 全局/快速调试FAutoConsoleCommand

  • 模块/插件IConsoleManager::RegisterConsoleCommand

  • 类内扩展 → 重写 Exec

  • 作弊/调试命令CheatManager + exec

相关推荐
ThornArmor6 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
Elsa️7468 小时前
算法一周刷题总结
c++·算法
小小数媒成员8 小时前
如何优化代码适应托管内存?
游戏·unity·游戏引擎
风合星语8 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
小羊没烦恼!8 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
welfare9629 小时前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++
雪落漂泊10 小时前
C++11(上)
开发语言·c++
zh路西法11 小时前
【玩转VLA具身智能机械臂】(四):点云分割与 OBB 夹取——从 PCA 失效到主动扫描
c++·机械臂·pca·vla·planner·obb·moveit2
爱和冰阔落11 小时前
【Linux】条件变量为什么必须配合互斥锁:从 pthread_cond_wait 到阻塞队列
linux·运维·c++·缓存·中间件·安卓
初願致夕霞11 小时前
Linux 进程间通信(IPC)机制详解:管道、FIFO 与 System V 共享内存
linux·服务器·c++