首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何在代码中创建一个抽象类,让蓝图扩展它,并将该蓝图返回给代码实例化?

我如何在代码中创建一个抽象类,让蓝图扩展它,并将该蓝图返回给代码实例化?
EN

Stack Overflow用户
提问于 2019-06-21 17:04:30
回答 1查看 8.6K关注 0票数 3

假设我想要在代码中创建一个AI类,用于控制典当,但我希望我的设计人员能够使用蓝图来修改快速迭代的行为。

假设我在MyProjectBaseAI.h里有这个

代码语言:javascript
复制
#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++代码能够实例化它?假设我有一个类想像这样实例化实现类(当前使用基类):

代码语言:javascript
复制
AMyProjectBaseAI* ai = World->SpawnActor<AMyProjectBaseAI>(...);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-21 17:04:30

抽象类设置:

  1. 使用AbstractUCLASS中的Blueprintable说明符将类标记为抽象的和可蓝图的(尽管,当您从AActor或其他可蓝图类继承时,Blueprintable说明符是多余的)。
  2. BlueprintImplementableEventUFUNCTION说明符中使用DetermineGoalPosition。这允许蓝图实现该功能。

此外,不声明该函数为虚拟,这是自ver 4.8以来根据非真实的标准进行的

新增:从多个引擎级别的BlueprintImplementableEvents中删除"BlueprintImplementableEvents“关键字,以符合新的”BlueprintImplementableEvents不应该是虚拟的“标准。

  1. BlueprintCallableUFUNCTION说明符中使用SetGoalPosition属性。这允许从蓝图中调用函数。 #语用一旦#包括"EngineMinimal.h“#包括"GameFramework/Actor.h”#包括"MyProjectBaseAI.generated.h“(抽象,蓝图)类MYPROJECT_API AMyProjectBaseAI : AActor { GENERATED_BODY() public: AMyProjectBaseAI(const FObjectInitializer& ObjectInitializer);虚拟空洞BeginPlay(重写);虚拟空滴答( DeltaSeconds);UFUNCTION(BlueprintCallable) void SetGoalPosition(FVector pos);UFUNCTION(BlueprintImplementableEvent) void DetermineGoalPosition(int32 stateData1,int32 stateData2);私人: FVector goalPosition;};

即时设置

  1. 然后,在类的标题中,您希望在检查器中设置实现类,有一个带有EditAnywhere说明符的公共EditAnywhere变量(如果子类只应在编辑器中的蓝图或实例级别设置,则为EditDefaultsOnlyEditInstanceOnly ): 公众: UPROPERTY(EditAnywhere) TSubclassOf AIImplementationClass;
  2. 然后在实例化它的地方,只需使用AIImplementationClass作为类: AMyProjectBaseAI* ai = World->SpawnActor(AIImplementationClass);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56707746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档