如何在代码中创建抽象类,让蓝图扩展它,并将该蓝图返回给代码进行实例化?
How can I create an abstract class in code, let a blueprint extend it, and give that blueprint back to code to instantiate?
假设我想在代码中创建一个用于控制棋子的AI类,但我希望我的设计师能够使用蓝图修改行为以进行快速迭代。
假设我在MyProjectBaseAI.h中有这个:
#pragma once
#include "EngineMinimal.h"
#include "GameFramework/Actor.h"
#include "MyProjectBaseAI.generated.h"
UCLASS()
class MYPROJECT_API AMyProjectBaseAI : AActor
{
GENERATED_BODY()
public:
AMyProjectBaseAI(const FObjectInitializer& ObjectInitializer);
virtual void BeginPlay() override;
virtual void Tick(float DeltaSeconds) override;
void SetGoalPosition(FVector pos);
virtual void DetermineGoalPosition(int32 stateData1, int32 stateData2) = 0;
private:
FVector goalPosition;
};
我想使这个类抽象,并有一个蓝图,能够实现DetermineGoalPosition(...);
调用SetGoalPosition(FVector pos)
,具体取决于他们对AI的设计。
那么,设计人员如何在检查器中设置实现类,以便我的C++代码可以实例化它?假设我有一个类想要像这样实例化实现类(当前使用基类):
AMyProjectBaseAI* ai = World->SpawnActor<AMyProjectBaseAI>(...);
抽象类设置:
-
使用
UCLASS
中的Abstract
和Blueprintable
说明符将类标记为抽象和可蓝图(尽管,当您从AActor
或其他可蓝图类继承时,Blueprintable
说明符是多余的)。 -
在
UFUNCTION
说明符中使用BlueprintImplementableEvent
进行DetermineGoalPosition
。这允许蓝图实现该功能。
另外,不要根据虚幻引擎4.8版的标准将该函数声明为虚拟函数:
新增功能:从多个引擎级蓝图实现事件中删除了"虚拟"关键字,以符合新的"蓝图实现事件不应是虚拟的"标准。
-
在
UFUNCTION
说明符中使用BlueprintCallable
属性进行SetGoalPosition
。这允许从蓝图调用函数。#pragma once #include "EngineMinimal.h" #include "GameFramework/Actor.h" #include "MyProjectBaseAI.generated.h" UCLASS(Abstract, Blueprintable) class MYPROJECT_API AMyProjectBaseAI : AActor { GENERATED_BODY() public: AMyProjectBaseAI(const FObjectInitializer& ObjectInitializer); virtual void BeginPlay() override; virtual void Tick(float DeltaSeconds) override; UFUNCTION(BlueprintCallable) void SetGoalPosition(FVector pos); UFUNCTION(BlueprintImplementableEvent) void DetermineGoalPosition(int32 stateData1, int32 stateData2); private: FVector goalPosition; };
实例化器设置
-
然后在类的标头中,您希望在检查器中设置实现类,使用带有
EditAnywhere
说明符的公共TSubclassOf<AMyProjectBaseAI>
变量(如果子类应仅在编辑器中的蓝图或实例级别设置,则EditDefaultsOnly
或EditInstanceOnly
):public: UPROPERTY(EditAnywhere) TSubclassOf<AMyProjectBaseAI> AIImplementationClass;
-
然后在实例化它的地方,只需使用
AIImplementationClass
作为类:AMyProjectBaseAI* ai = World->SpawnActor<AMyProjectBaseAI>(AIImplementationClass);
- 为什么这段代码返回 -nan(ind)?C++
- 为什么我的代码返回了错误的平方值?C++
- 从本机代码返回到托管代码会损坏返回的对象
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- 为什么此代码返回分段错误错误?
- C 语法,根据此代码返回值类型
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 为什么下面的使用链表实现线性队列的代码返回垃圾值然后崩溃
- 为什么下面的代码返回向量大小为 10
- 从本机代码返回"const char*"并在java中获取"字符串"
- JNI 代码返回字符串,但得到错误 java.lang.UnsatisfiedLinkError: com.packag
- 相同的数字代码返回不同的输出,无论是 C++ 还是 C
- C/C++ 从 x86 代码返回
- 从 mfc 应用程序点击网络服务,并希望从网络服务登录方法读取用户代码返回
- 代码块 10.05 和 12.11、13.12 使用相同的代码返回不同的结果
- C++将字符串转换为 wstring 并使用最小代码返回
- 混合托管C++方法并不总是向调用C#代码返回相同的结果
- 可以将用于向std::字符串返回const ref的函数更改为通过值break调用代码返回
- 请解释这段代码(返回语句)
- 项目欧拉任务#8在c++中,代码返回错误答案的微妙原因