[UE4]在C++中实现控制台指令

自定义控制台变量:

https://docs.unrealengine.com/4.27/zh-CN/ProductionPipelines/DevelopmentSetup/Tools/ConsoleManager/

”Stat“类的

如"Stat fps"

1. GEngine->Exec(GetWorld(), TEXT("stat fps"));

2. TArray<FString> EnabledStats;
    EnabledStats.Add("fps");
    World->GetGameViewport()->SetEnabledStats(EnabledStats);

"Show"类的

如"show shadercomplexity"

FOutputDevice& Out = *GLog;
            UWorld* World = GetWorld();
            World->GetGameViewport()->HandleViewModeCommand(TEXT("SHADERCOMPLEXITY"), Out, World);

1. 引擎单例派生类可直接调用方法

以下类的派生类中可以通过在方法上标记 UFUNCTION(Exec) 直接调用方法 
Pawns, Player Controllers, Player Input, Cheat Managers, Game Modes, Game Instances, overriden Game Engine classes, and Huds should all work by just adding the standard UFUNCTION markup

我只在Game Mode的派生类中实测过,如下


声明控制台可执行标记 UFUNCTION(Exec)

UFUNCTION(Exec)
    virtual void solname(FString _str, int32 _num);

void AMyGameMode::solname(FString _str, int32 _num)
{
    FString str = FString::Printf(TEXT("--- %s - %d"), *_str, _num);
    UE_LOG(LogMyTest, Warning, TEXT("--- %s - %d"), *_str, _num);
}
按到 ` 键,输入指令 solname asd 123 

结果 

2. 自定义类调用方法


自定义类  

MyActor.h


#pragma once


#include "MyActor.generated.h"


UCLASS()
class MYTEST_API AMyActor : public AActor
{
    GENERATED_BODY()
public:
    AMyActor();
    virtual ~AMyActor();

    void SetInfo(FString name);

    UFUNCTION(Exec)
    void Say();

private:
    FString mName;
};1234567891011121314151617181920212223
MyActor.cpp


#include "MyTest.h"


#include "MyActor.h"


AMyActor::AMyActor()
{
}

AMyActor::~AMyActor()
{

}

void AMyActor::SetInfo(FString name)
{
    mName = name;
}

void AMyActor::Say()
{
    UE_LOG(LogMyTest, Warning, TEXT("name:%s, Say hello"), *mName);
}
如果不加点手段,在控制台输入 Say 是不会掉用对应的方法,所以在派生自 UGameInstance (只要是 引擎单例派生类 都可)中扩展类中,重写 ProcessConsoleExec 方法,(下面 生成实例的方法就不贴了)

bool UMyGameInstance::ProcessConsoleExec(const TCHAR* Cmd, FOutputDevice& Ar, UObject* Executor)
{
    bool ret = Super::ProcessConsoleExec(Cmd, Ar, Executor);
    if (!ret)
    {
        for (AMyActor* actor : mActorVec)
            ret = actor->ProcessConsoleExec(Cmd, Ar, Executor);
    }
    UE_LOG(LogMyTest, Warning, TEXT("--- Cmd:%s exec:%d"), Cmd, (int32)ret);
    return ret;
}

3

如何构建自己的控制台指令呢?
我们将要使用到UFUNCTION宏中的指令Exec,这条指令可以帮助我们在控制台构建指令函数,指令名即为函数名称。格式如下:
UFUNCTION(Exec)
void TestCmd(参数表)
使用时,只需要在运行阶段,使用按键~,打开控制台,然后搜寻TestCmd指令,输入对应参数,即可调用TestCmd函数,非常的简单!
注意,并不是所有的类都支持加入Exec指令,只有Possessed Pawns(拥有操控权pawn), Player Controllers,Player Input, Cheat Managers, Game Modes, Game Instances, 引擎重写类, HUD。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值