はじめに
BlueprintのみでGameplayAbilitySystem(GAS)でエイムモード切替を作ってみました。
Blueprintだけでも(やや不便ですが)Abilityが作れます。
GASを使うと、Actorの外にActorの能力を書くことが出来るので、とてもスッキリします。
また、アイテムを買った時に能力を追加するなど、動的なゲームプレイ拡張にも使えそうです。
ところが、BPのみだと、ActivateAbilityはできますが、CancelAbilityなど外部からAbilityを終了させるメソッドが直接は呼び出せません。
しかし、GameplayEventを使えば、BPのみでAbilityの動作を外から変えられますので、やってみましょう。
※この記事を作成したUEのバージョンは5.3.2です
※何度かBPコンパイルとエディタ再起動が必要ですが、記事上は割愛させてください
サードパーソンテンプレートで新規プロジェクトを作ります
GASの準備
GASプラグインを有効化
エイム能力と、エイム切り替えイベントにつかう、GameplayTagを追加します
このTagによって、発動中の能力の確認ができたり、Tag指定で能力発動ができたりしてとても便利です。
プロジェクト設定

GameplayTagsから、ゲームプレイタグを管理

+ボタンを押す

ability.aimと名付けて、タグソースを選択して、新しいタグを追加

これでability.aimというGameplayTagの追加ができました
同様に、event.toggleAimというTagも追加しておきます。

GameplayAbilityブループリント作成
エイム能力を作ります!
コンテンツブラウザ右クリック→ブループリントクラス

GameplayAbility選択

ファイル名はGA_Aimにしておきます。
このファイルにエイム処理を書いていきます

GA_Aimをダブルクリックして、表示も今のうちにフルブループリントエディタにしておきます

詳細のAbilityTagsから、先程追加したaimをチェック

エイム処理を書く
エイム中は、プレイヤーキャラが以下のような状態になります
・カメラがキャラに寄って
・キャラの向きが固定になる
カメラがキャラに寄って、キャラの向きが固定になる
引き続きGA_Aimの編集処理が続きます。
GA_Aimでは、event.toggleAimイベントで、エイムモードを切り替える処理を書きます。

FlipFlop Aから、以下を書きます。

FlipFlop Bから、以下も書きます。

GA_Aim全体はこんな感じになりました。

キャラに能力を持たせて、発動
手順は以下のような感じ
・GA_Aim能力をキャラに持たせて、能力を発動
・能力発動中は、event.toggleAimイベントを受けるごとに、エイムモード切り替え
まずは能力をもたせます。
キャラのBPであるBP_ThirdPersonCharacterを開いて、
コンポーネントからAbilitySystemを追加します。

AbilitySystemをイベントグラフ上にドラッグして、
GiveAbilityノードを出して、
GiveAbilityのAbilityClassにはGA_Aimを指定して、
GiveAbilityのReturnValueから、Promote to variableを選びます

変数名はAimAbilityHandleとしました。

実行ピンを以下のように繋ぎます。

これでキャラにAim能力が付与されました。
つぎはエイムの切り替え処理を書きます
手順は以下のような感じ
・EnhancedInputSystemでevent.toggleAimというGameplayEventを投げる
・event.toggleAimを受け取ったら、エイムモードを切り替える
まずはEnhancedInputSystemようのアセット作成します。
コンテンツブラウザで、右クリック、入力、入力アクション

名前はIA_ToggleAimとします

コンテンツブラウザで、右クリック、入力、入力マッピングコンテキスト

名前はIMC_Aimとします。ダブルクリックで開いて、IA_ToggleAimを左Ctrlキーとバインドします

この入力バインドを、GA_Aim能力付与と同じタイミングで付与しましょう。
BP_ThirdPersonCharacterのGA_Aimを付与した箇所で、以下のようにします。

これでキャラがIA_ToggleAimを受け取れるようになるので、エイム切り替えを行います。
以下のようにします。


これで、IA_ToggleAim入力がキャラに届いたら、event.toggleAimがGASに送られ、受け取ったGA_Aimがエイムを切り替えます。



