とりあえず攻撃対象が存在しないことにはゲームとして成り立たないので、敵を作ることにします。使用する敵アセットは、Maximoからダウンロードしてくるか、マーケットプレースで無料アセットをゲットするかして用意します。今回は、マーケットプレースで無料で入手できるParagonシリーズのMurdochを使用します。
Enemyクラスを作成する
親クラスにCharacterを選択してEnemyという新しいクラスを作成します。
MyProject.Build.csにNavigationSystemとAIModuleを追加します。
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "PhysicsCore", "NavigationSystem", "AIModule" });
Enemy.hのprivateセクションに変数を宣言します。
UPROPERTY(EditAnywhere, Category = AI, meta = (AllowPrivateAccess = "true")) class UBehaviorTree* BehaviorTree;
publicセクションにgetterを宣言します。
RCEINLINE UBehaviorTree* GetBehaviorTree() const {return BehaviorTree;}
コンパイルしてUE4エディタを起動します。
Enemyブループリントの作成
Enemyクラスに基づくブループリントを新規作成します。フォルダはEnemiesを選択、名前はEnemy_BPにします。
スケルタルメッシュにMurdochを選択します。
Anim ClassにMurdochのブループリントを選択します。
AIControllerクラスの作成
AIControllerを親クラスにC++クラスを新たに作成します。ファイル名はここではEnemyControllerにしています。
EnemyController.hに関数と変数を宣言します。
public: AEnemyController(); virtual void OnPossess(APawn* InPawn) override; private: UPROPERTY(BlueprintReadWrite, Category = AI, meta = (AllowPrivateAccess = "true")) class UBlackboardComponent* BlackboardComponent; UPROPERTY(BlueprintReadWrite, Category = AI, meta = (AllowPrivateAccess = "true")) class UBehaviorTreeComponent* BehaviorTreeComponent; public: FORCEINLINE UBlackboardComponent* GetBlackboardComponent() const {return BlackboardComponent;}
EnemyController.cppにコードを記述します。
#include "EnemyController.h" #include "Enemy.h" #include "BehaviorTree/BehaviorTree.h" #include "BehaviorTree/BehaviorTreeComponent.h" #include "BehaviorTree/BlackboardComponent.h" AEnemyController::AEnemyController() { BlackboardComponent = CreateDefaultSubobject<UBlackboardComponent>(TEXT("BlackboardComponent")); check(BlackboardComponent); BehaviorTreeComponent = CreateDefaultSubobject<UBehaviorTreeComponent>(TEXT("BehaviorTreeComponent")); check(BehaviorTreeComponent); } void AEnemyController::OnPossess(APawn* InPawn) { Super::OnPossess(InPawn); if (InPawn == nullptr) return; AEnemy* Enemy = Cast<AEnemy>(InPawn); if (Enemy) { if (Enemy->GetBehaviorTree()) { BlackboardComponent->InitializeBlackboard(*(Enemy->GetBehaviorTree()->BlackboardAsset)); } } }
EnemyのAI構築
EnemyControllerクラスをベースにブループリントを新規に作成します。
AIのブラックボードを新規に作成します。
AIのビヘイビアツリーを新規に作成します。
Enemy_BPを開き検索窓にbeと入力、Behavior Treeに先程作成したビヘイビアツリーを選択してコンパイルと保存を押します。
これで敵の作成は完了です。後は、敵がAIで動くように設定していくだけです。
コメント