【UE5】GASでエイムモード【BPのみ】

## はじめに
BlueprintのみでGameplayAbilitySystem(GAS)でエイムモード切替を作ってみました。
Blueprintだけでも（やや不便ですが）Abilityが作れます。
GASを使うと、Actorの外にActorの能力を書くことが出来るので、とてもスッキリします。
また、アイテムを買った時に能力を追加するなど、動的なゲームプレイ拡張にも使えそうです。

ところが、BPのみだと、ActivateAbilityはできますが、CancelAbilityなど外部からAbilityを終了させるメソッドが直接は呼び出せません。
しかし、GameplayEventを使えば、BPのみでAbilityの動作を外から変えられますので、やってみましょう。

※この記事を作成したUEのバージョンは5.3.2です
※何度かBPコンパイルとエディタ再起動が必要ですが、記事上は割愛させてください

## サードパーソンテンプレートで新規プロジェクトを作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/d4c6a033-4a54-2781-3d43-c23c37972c86.png)

## GASの準備
### GASプラグインを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/11a1a0fa-dc1a-bd78-8132-424b012b3af0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/a2a30410-a7f2-eff0-6e3e-2e0bf16fe41a.png)

### エイム能力と、エイム切り替えイベントにつかう、GameplayTagを追加します
このTagによって、発動中の能力の確認ができたり、Tag指定で能力発動ができたりしてとても便利です。

プロジェクト設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/b0f67a8d-db7d-a9f7-91f1-3f25f01c8409.png)
GameplayTagsから、ゲームプレイタグを管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/398540ad-1b40-88cc-dffa-8dcf63225ea1.png)
+ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/cec1a2f2-549d-2d44-b3ce-182ca0e2315f.png)
ability.aimと名付けて、タグソースを選択して、新しいタグを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/a54a7aa1-1d46-6590-0190-4465cab80f76.png)
これでability.aimというGameplayTagの追加ができました
同様に、event.toggleAimというTagも追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/65b13795-99ec-c7da-313f-0964d87bf838.png)

### GameplayAbilityブループリント作成
エイム能力を作ります！
コンテンツブラウザ右クリック→ブループリントクラス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/d35a087b-3883-4bc5-ce85-2c202d3ae125.png)
GameplayAbility選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/363d741b-7e7f-2224-f1b0-011996f412f4.png)
ファイル名はGA_Aimにしておきます。
このファイルにエイム処理を書いていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/28c6624c-8fca-9849-9f5c-b302877f0e39.png)
GA_Aimをダブルクリックして、表示も今のうちにフルブループリントエディタにしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/7d078f72-05b5-e92e-aff1-130d8c5adc97.png)
詳細のAbilityTagsから、先程追加したaimをチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/4df4ab82-e0f6-5462-9a4e-b2280372a834.png)

#### エイム処理を書く
エイム中は、プレイヤーキャラが以下のような状態になります
・カメラがキャラに寄って
・キャラの向きが固定になる

#### カメラがキャラに寄って、キャラの向きが固定になる
引き続きGA_Aimの編集処理が続きます。
GA_Aimでは、event.toggleAimイベントで、エイムモードを切り替える処理を書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/3bec148a-5e00-5e57-c3c9-f525c9ed0aa4.png)

FlipFlop Aから、以下を書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/f77e7227-5de2-db1f-4804-b7c2b32932ab.png)
FlipFlop Bから、以下も書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/4afb6c9b-5784-823f-39f1-e1ca745a546c.png)
GA_Aim全体はこんな感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/cca6112f-0104-6068-d9c1-e65dcdcc8be8.png)


#### キャラに能力を持たせて、発動
手順は以下のような感じ
・GA_Aim能力をキャラに持たせて、能力を発動
・能力発動中は、event.toggleAimイベントを受けるごとに、エイムモード切り替え

##### まずは能力をもたせます。
キャラのBPであるBP_ThirdPersonCharacterを開いて、
コンポーネントからAbilitySystemを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/c603943a-85db-c04e-f636-fc56834aea76.png)
AbilitySystemをイベントグラフ上にドラッグして、
GiveAbilityノードを出して、
GiveAbilityのAbilityClassにはGA_Aimを指定して、
GiveAbilityのReturnValueから、Promote to variableを選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/6b4fb015-6826-7c13-6d1a-87d0d1c60bdf.png)
変数名はAimAbilityHandleとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/cb15d80b-ecb4-a9a6-28b1-55391ec22eb3.png)
実行ピンを以下のように繋ぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/d7d8f26f-ce2a-c1bc-432a-c13eff3aa7ab.png)
これでキャラにAim能力が付与されました。

#### つぎはエイムの切り替え処理を書きます
手順は以下のような感じ
・EnhancedInputSystemでevent.toggleAimというGameplayEventを投げる
・event.toggleAimを受け取ったら、エイムモードを切り替える
まずはEnhancedInputSystemようのアセット作成します。
コンテンツブラウザで、右クリック、入力、入力アクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/8860b8a9-7b50-baa1-3606-bf1428d11303.png)
名前はIA_ToggleAimとします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/3384ecb2-1653-d729-f507-99e1538bcece.png)
コンテンツブラウザで、右クリック、入力、入力マッピングコンテキスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/29d0c670-449d-dbe4-83f7-5040dc2ac003.png)
名前はIMC_Aimとします。ダブルクリックで開いて、IA_ToggleAimを左Ctrlキーとバインドします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/a19d2979-20fa-d4a8-9dd0-1f9670fdb6d0.png)
この入力バインドを、GA_Aim能力付与と同じタイミングで付与しましょう。
BP_ThirdPersonCharacterのGA_Aimを付与した箇所で、以下のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/080dbd2a-629a-9736-6fa2-151c6298f989.png)
これでキャラがIA_ToggleAimを受け取れるようになるので、エイム切り替えを行います。
以下のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/4ce73c20-39fc-fc02-eb58-953d66e88b01.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/9104eae3-7d6b-b533-a86f-4392c67ec92b.png)
これで、IA_ToggleAim入力がキャラに届いたら、event.toggleAimがGASに送られ、受け取ったGA_Aimがエイムを切り替えます。

## 動作確認
左ctrlキーでエイムモード切り替え！！
![GasAim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630135/993595bc-3e0d-859e-6e05-6217a331aad5.gif)