Как я могу создать абстрактный код в коде, позволить проекту расширить его и вернуть этот план обратно к коду для создания экземпляра? - PullRequest
0 голосов
/ 21 июня 2019

Предположим, я хочу создать класс 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) в зависимости от их дизайна ИИ.

Тогда, как дизайнеры могут установить реализующий класс в инспекторе, чтобы мой код C ++ мог его создать? Предположим, я использую AMyProjectBaseAI ai = World->SpawnActor<AMyProjectBaseAI>(...);

1 Ответ

1 голос
/ 21 июня 2019
  1. Используйте спецификаторы Abstract и Blueprintable в UCLASS, чтобы пометить класс как абстрактный и blueprintable (хотя, когда вы наследуете от AActor или другого blueprintable класса, Blueprintable спецификатор является избыточным).

  2. Используйте BlueprintImplementableEvent в спецификаторе UFUNCTION для DetermineGoalPosition.Это позволяет проектам реализовать функцию.

    Кроме того, не объявляет функцию виртуальной , в соответствии со стандартом Unreal, начиная с ver 4.8 :

    Новое: удалено "виртуальное"ключевое слово из нескольких BlueprintImplementableEvents уровня двигателя, чтобы соответствовать новому стандарту «BlueprintImplementableEvents не должно быть виртуальным».

  3. Используйте свойство BlueprintCallable в спецификаторе UFUNCTION для 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;
    };
    
  4. Затем в заголовке класса, в котором вы хотите установить класс реализации в инспекторе, есть общедоступный TSubclassOf<AMyProjectBaseAI> переменная с указателем EditAnywhere:

    public:
        UPROPERTY(EditAnywhere)
        TSubclassOf<AMyProjectBaseAI> AIImplementationClass;
    
  5. А затем, где вы создаете его, просто используйте AIImplementationClass в качестве класса:

    AMyProjectBaseAI ai = World->SpawnActor<AMyProjectBaseAI>(AIImplementationClass);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...