GameplayAbilitiesの使い方(セットアップ編)

UnrealEngine4.20のリリースに伴いActionRPGのサンプルが公開されたので、早速調査を開始したのですが・・・これがまぁいかんせん範囲が広くてどこから手を付ければって感じでして。

まずはプレイヤー周りかなーと思って見始めたところ、どうもActionRPGサンプルではGameplayAbilitiesプラグインというものを使ってるらしい。

機能の全体像を把握しておくためにも、ここを先に理解しておいた方が良さそうだ、ということで

GameplayAbilities and You - Epic Wiki

まずは、こちらを見つつ、ごにょごにょしてみた結果を書いてみたいと思います。

あ、もちろん英語が得意な方は上記記事を直接読んでいただいたほうがよいかと思います、オフィシャルなので。

あと、本記事はC++とBlueprintをミックスして使う予定です。なぜならGameplayAbilitiesプラグインがそういうものだからw

なので、本記事もUE4C++にも多少触れたことがある人が対象となっております。

GameplayAbilitiesとは?

主にアクションゲーム向けだと思いますが、プレイヤーが剣で敵を攻撃したり、ファイヤーボールを発射し敵に当たり爆発してダメージを与えたり、範囲爆発を発生させたり、またそれに伴ってMPやスタミナを消費したりと、その辺の実装をシステム的にサポートしてくれる部分とうたわれています。

言葉だけ聞くとものすごく便利そうですが、本当にそうなのだろうか・・・甘い言葉に過去の自分の経験が警告を発しますw

いずれにしても、使ってみないとわからないのでとりあえず触ってみましょう。

1個ずつ順を追っていきます。

 

プロジェクト作成

UEの4.20を起動し、[新規プロジェクト]→[C++]→[ThirdPerson]でプロジェクトを作ります。

設定は、デスクトップ、ハイエンド、スターターコンテンツ有りで、プロジェクト名はGPAとしました。

f:id:nca03132:20180730210226p:plain

 

次にプラグインの追加します。

f:id:nca03132:20180721173534p:plain

 

これでプラグインウィンドウを開いて、Gameplayのカテゴリの一番下にある・・・

f:id:nca03132:20180721173713p:plain

このGameplay AbilitiesをEnableにします。

チェックボックスをクリックしたときに「こいつはまだベータ版だけどいっすか?」的な確認ダイアログが出たらYESを押してください。

さらに、このプラグインを有効かするにはUE4の再起動が必要だといわれるので

f:id:nca03132:20180721175918p:plain

ここのRestart nowを押してください。これでプラグインが有効になります。

AbilitySystemComponentを追加

つぎにVisualStudioでC++側の設定を行います。VisualStudioを閉じてしまった場合はGPA.slnをダブルクリックして再起動しておいてください。
GPA.Build.csを編集して、ビルド時にGameplayAbilitiesのモジュールがビルドされるように変更します。

f:id:nca03132:20180730211032p:plain

このファイルのPublicDependencyModuleNames.AddRangeの引数にある文字列リストの最後に"GameplayAbilities"を加えます。 

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "GameplayAbilities" });

こんな感じですね。

 

次にキャラクターのヘッダとC++ファイルにAbilitySystemComponentを追加します。

〇GPACharacter.h

  • アビリティシステムを使うために#include "AbilitySystemInterface.h"を追加。f:id:nca03132:20180722143943p:plain
  • AGPACharacterの継承もとにpublic IAbilitySystemInterfaceを追加

    f:id:nca03132:20180730212706p:plain

  • AbilitySystemComponentとアクセッサの追加

    記述場所はAGPACharacterのクラス定義の一番後ろ、GetFollowCameraの定義の行の後に追加します。 
    /** ability system */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Abilities, meta = (AllowPrivateAccess = "true"))
    class UAbilitySystemComponent* AbilitySystem;
    UAbilitySystemComponent* GetAbilitySystemComponent() const
    {
    	return AbilitySystem;
    };
    /** ability list */
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Abilities)
    TArray<TSubclassOf<class UGameplayAbility>> AbilityList;

    /** BeginPlay, PossessedBy override */
    virtual void BeginPlay() override;
    virtual void PossessedBy(AController * NewController) override;
    "AbilitySystem"は、UAbilitySytemComponentのポインタ
    "GetAbilitySystemComponent"はそのアクセッサ
    "AbilityList"はこのキャラクターが保持するAbilityを保存しておくためのリスト
    となっています。AbilityListには後ほどBP上でアビリティを登録します。
    また、初期化用にBeginPlay,PossessedByもオーバーライドしておきます。

これでヘッダの変更は終了。

〇GPACharacter.cpp

  • AbilitySystemComponent.hをインクルード

    f:id:nca03132:20180730220603p:plain

  • コンストラクタの記述追加
    コンストラクタの最後、Noteのコメント行の後ろにAbilitySystemComponentを生成する記述を追記
    // ability system component
    AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
  • BeginPlayの実装
    ソースファイルの最後にBeginPlayでアビリティシステムにアビリティを追加する
    void AGPACharacter::BeginPlay()
    {
    	Super::BeginPlay();
    	if (AbilitySystem)
    	{
    		int32 inputID(0);
    		if (HasAuthority() && AbilityList.Num() > 0)
    		{
    			for (auto Ability : AbilityList) {
    				if (Ability)
    				{
    					AbilitySystem->GiveAbility(	FGameplayAbilitySpec(Ability.GetDefaultObject(), 1, inputID++));
    				}
    			}
    		}
    		AbilitySystem->InitAbilityActorInfo(this, this);
    	}
    }
    基本構造としてはAbilityListをforで回して、中のAbilityを1つずつAbilitySytemの登録します(GiveAbility)。その時IDが必要になるので、0から順番に自動で割り振っています。
    全登録が終わったらAbilitySystemのActorInfoを初期化してます。
  • PossessedByの実装
    PossessedByでコントローラに所有されたときにアビリティシステムをリフレッシュします。
    void AGPACharacter::PossessedBy(AController * NewController)
    {
    	Super::PossessedBy(NewController);
    
    	AbilitySystem->RefreshAbilityActorInfo();
    }

    この機能は一瞬不要に見えますが、ネットワーク対応ゲームでは先にキャラクタが生成されたあとでコントローラから所有処理が走ることがあるので、入れておいたほうがよいみたいです。

さて、ここまで来たらUE4エディタ側は「すべて保存」して閉じておきます。(起動していてもリロードでおかしくなるので)

VisualStudio側でビルドして通るか確認してください。

 

ブループリントちゃんのセットアップ

さて、次からは実際にキャラクターにアビリティを追加して・・・・行きたいのですが、このままUE4標準マネキンだとアクションさせるモーションがないので、今回は

株式会社 Indie-us Gamesさんのところで配布されているブループリントちゃんを使わせていただきたいと思います。

ブループリントちゃんをダウンロード&展開していただきUE4エディタを閉じた状態で

BLUEPRINTchan\BPchan\Contentの中にあるBluePrintChanフォルダを、GPA\Contentの中にコピーしてください。

完了したらGAP.uprojectをダブルクリックして再びUE4エディタを起動しましょう。

で、このままプレイしてしまうとマネキンがプレイヤーとして動いてしまうので、アウトライナのThirdPersonCharacterを選択し

f:id:nca03132:20180730230302p:plain

詳細のThirdPersonCharacterのPawnの中にあるAuto Possessed Playerを

f:id:nca03132:20180730230635p:plain

このようにDisabledにしておいてください。

次にコンテンツブラウザでコンテンツ→BluePrintChan→BluePrintにあるBP_BPChanを

f:id:nca03132:20180730231039p:plain

ドラッグ&ドロップでレベル上に配置してください。

f:id:nca03132:20180730230942p:plain

そして先ほどのマネキンとは反対にアウトライナ上のBP_BPChanが選ばれている状態で

f:id:nca03132:20180730231256p:plain

詳細のBP_BPChanのPawnの中にあるAuto Possessed PlayerをPlayer 0にしてください。

f:id:nca03132:20180730231434p:plain

できましたら一旦すべてを保存してプレイしてみましょう。

f:id:nca03132:20180730231612p:plain

このようにプレイヤーキャラクターとして動かせるようになっていれば成功です。

セットアップの最後に、ブループリントちゃんをAbilitySystemを保持しているGPACharacterを派生させたものに変更します。

BP_BPChanのブループリントをダブルクリックで開いて、コンポーネントにあるCameraBoomとFollowCameraを削除します。

f:id:nca03132:20180730231941p:plain

これらはGPACharacter側ですでに保持しているためです。

次にBP_BPchanのクラス設定を押し

f:id:nca03132:20180730232138p:plain

詳細パネルのクラスオプションで親クラスをCharacterからGPACharacterに変更します。

f:id:nca03132:20180730232242p:plain

これでブループリントちゃんもアビリティを保持できるようになりました。

コンパイルして保存してください。

最後に、再度プレイを行ってみて正常にブループリントちゃんが動かせるか確認してみてください。

さてこの後は?

セットアップ編はこれで終わりです。お疲れさまでした。

次回は実際にアビリティを作ってブループリントちゃんに実行していただきます!