[UE4/UE5] GASでオンラインゲーム Part2 「投げる」アビリティの実装

Post 2022年2月22日火曜日

GameplayAbility GASでオンラインシリーズ UE4 UE5 Unreal Engine オンラインゲーム

前回の続き(というより一部)

今回はGameplay Ability System (通称GAS)を使って「投げる」アクションを作っていきます。

お約束
この記事作成にあたって使用した主なUnreal Engine バージョンUE4.27.2

本日のゴール

「投げるボタンを押している間予測パスが出てきて、ボタンを離す瞬間にボールが飛ぶ」を実装したい


実際の実装

まずは設定から。

基本的には何も考えずに、上記でOKです。

Instancing Policyは〜 Per Executionではなく、Per Actorにしましょう。Per Executionにすると、Spawn Actorなどを実行したときにサーバーとクライアント側で二個アクターが生成されてしまいます。

もちろん例外もありますけど。

GA_Throw
はい。これがGA_Throwです。


ってなんじゃこりゃですよね。はい。ザクッと紹介します。



まずは「Get Owing Actor from Actor Info」ノードです。これはよく使うノードで、実行中のGAを有するアクターを引っ張り出すことができます。でこれをCastして操作キャラのBPを取り出してます。(あまりCastは使いたくないですが) 
CastFailedも必ずEnd Abilityにつなげるのをお忘れなく。


続いて、先程のCastした操作キャラのBP使って、カメラを切り替えて投げるモードにします。投げるモーションの状態変数「Ready For Throw」を書き換えて投げるモーションモードにします。この変数は前回の通り、このキャラのAnim BPと連携しているので、この変数を書き換えるだけでモーションが自動的に変わります。
しかも、このGAというのはサーバー側でも勝手に実行してくれるので、RPCを使う必要がありません。めっちゃシンプルになります。

あ、でも他のクライアントでは勝手に実行はしませんので、「Ready For Throw」のReplicateはオンにしましょう。

GAは、Local Controlledされている操作プレイヤー + Authority権限のプレイヤーで実行される が原則です。(Local Predicted設定の場合)

これだけだとControllerが一致したままになってしまうので、

Controllerの向きをアクターの向きと一致させます。
ただこの処理を普通に実行するとサーバー側の向きも変わってしまうので、「Is Locally Controlled」ノードをはさみましょう。

あとはWait Input Releaseで「投げるボタン」が離されるまで、予測パスをSpawnし続けるだけです。実際の実装ではGameplay Cueを使うと思いますが、とりあえずこれで。
投げる予測パスは、サーバー側で見れる必要はないので、「Is Locally Controlled」ノードをはさみましょう。
予測パスの作成方法に関しては、こちらの動画を参照しました。神。

参考:


投げた時点でCostが支払われるようにしています。Costってなんだよとなると思いますが、この場合は雪玉です。GAはコストというものを設定することができます。まあこれは後述しますのでこの時点では「ふーん」でいいです。


で、GAが終了時に先程色々やったカメラの操作を逆にします。GAがキャンセルによって終了した場合以外、投げきるGAを実行します。(GAがキャンセルした=投げるのを途中でやめたということです。)


GAからGAを実行するには、このように実行するか、Send Gameplay Eventを使うかなどの方法があります。
※実際の実装では2回実行されるのを防ぐため、GA内でGAを起動する前にIs Locally Controlledノードをつなぎましょう。

投げる方はそこまで難しくないです。座標を求めて雪玉をSpawnさせます。雪玉のSpawnはサーバー側だけでやればいいので、「Switch Has Authority」をつないでください。

投げるモーション(Animation Montage)を再生します。再生が終わるまではInputを無効にします。(正しい実装では、多分Characeter Movementを無効?)

※よく考えたらDisable Inputの前にはIs Locally Controlledを繋がないとだめですね。

最後にEnd Abilityにつないで終わりです。


・・・なんか説明雑じゃね?

あーすみません。自分でもそう思います。ぶっちゃけこの辺はいろんな方が記事にしているのでかなり はしょりました。
実際、これでもスポーン箇所にずれとかが発生する可能性はあって、そのへんはかなりアバウトです。とりあえず全体像ができてから微修正していきますかね…。

これから骨太な解説がガンガン必要になるので、こんなペースでいきます。すみませんがよろしくおねがいします。

おわり