[UE4/UE5] Gameplay Abilities (GAS) でオンラインゲーム Part1

Post 2022年2月22日火曜日

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

前回の続きですが、今回からいよいよ本格的に制作をスタートしていきますので、これをパート1とします。

オンラインゲームの基本については、「Unreal Engineでサクッとオンラインゲーム制作 Part1」を見てください。これを見ないと、何がなんやらだと思います。

さて今回からGameplay Abilities System (通称GAS) を使って、オンラインゲームを作っていきます。

C++ を一部使うので、一通りUnreal Engineを触った方向けです。

(導入部分は面倒なので、丸投げしていきます。。。)


できるだけはBPに頼りたいです、自分のために。(C++よく分からんない…)


「なんだよ、C++なんて触りたくないよ!サクッとオンラインゲーム作るんじゃないのかよ。嘘つきだ。」


と思われるでしょう。

実はリアルタイムゲームをサクッと作るためにはGASが必要なんです。(多分)

※リアルタイムゲームでなければRPCとReplicateさえ覚えておけばなんとかなると思います。


皆様がGASを学ぶきっかけになると、初心者ながらに幸いです。皆様も是非挑戦してみてくださいね。


私もやったんだからさ。


今後はこのページを中心に、複数の記事を組み合わせてゲームを作っていくスタイルでお届けする予定です。なのでこのページもどんどん加筆していきます。

とはいえ執筆時点でゲームは完成していないのでどうなるかはわかりません。

この記事の初稿の段階で、Part 4の内容までは完成しているので記事化するだけなんですけど、その後は未知数です。

あといつもの注意点ですが、GASはまだ4.27.2時点では正式実装に至っていません。噂ではUE5では正式実装するようなので(希望的観測)、今から身につけておくのは大事と思ってます。UE5ではもうちょい楽に実装できるといいんですけど…。

→ UE5 Preview 1でGAだけなら使えるようになりましたね。正式実装時にはAttributeもC++なしで弄れるかも!!


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

本日のゴール

GASを使ってゲームを作る


参考文献(これでも一部です)

公式ドキュメントは言うまでもないので割愛

GAS Documentation (日本語訳) --- 有志が作成したGAS Documentationを翻訳したもの。控えめに言って神。翻訳者のブログも添付しておきます。

プロジェクト(日本語訳)

https://github.com/sentyaanko/GASDocumentation/tree/lang-ja

Readmeの日本語訳

https://github.com/sentyaanko/GASDocumentation/blob/lang-ja/README.jp.md#concepts-at-definition

翻訳者のブログ

https://qiita.com/sentyaanko/items/8b6c3ca7c0891fbc49b0


[UE4] [UE5] GameplayAbility について中辛で --- GASを掘り下げたブログ。この記事がなかったら、今書いている記事は作れませんでした。

https://qiita.com/koorinonaka/items/47a8b263f4abe90c8eac


pto8913のメモ帳 --- GASについて自分の勉強成果をアップ頂いているブログ。このブログがあるので、正直自分の記事要らなくね?

https://pto8913.hatenablog.com/entry/2020/05/27/135109


おかわりのアンリアルなメモ --- GAS界ではかなり有名なブログ記事。GAS界ってなんだ?

https://okawari-hakumai.hatenablog.com/entry/2018/07/22/165242


愛をもってゲームをつくるゴリラのブログ --- 導入を非常に丁寧に説明されているので必見。

https://goolee.hatenablog.com/entry/2018/11/29/225428


ちなみに、GASをブループリントオンリーで作っていくというコードプラグインもあります。

GAS Companion

私は未購入&未検証ですが、3000円くらいなので、買ってみてもいいかもしれません。評価も高いし。ていうかEpicが買収するんじゃないかな、してくれ。


あるいはC++使わずにGASを使うというプラグインを開発しているYoutuberの方がいるので、そちらを使っていただいてもいいのかもしれません。(未検証)


その他、おかずさん(神)のSlide Shareや、alweiさん(神)のメモなども参考にさせて頂いています。


GASでできること、なんでGASを使うの?

まずはなんで面倒なGASを使うの?ということです。GASは、Fortniteなどでも採用されており、オンラインゲームに最適といえるシステム(らしい)です。

GASでできることは、簡単に言えば下記です。もうわかってるよという人は飛ばしてください。

① Gameplay AbilityとGameplay Tagを使った、アクション

Abilityが完了するまではTagが有効になります。このTagが有効の間は、他のAbilityを実行できなくしたり(排他処理)

逆にあるAbilityを実行するためには、あるTagが有効になっていないといけない、というように設定して、コンボ攻撃を実装(histria様の記事)したりします。

【今回について】今回は雪を投げるだけなのでコンボはないですね。避ける動作とかも実装しませんので、あまり実装することはないかも。雪玉を作るアクション、雪玉を渡すアクション、雪玉を投げるアクション、旗を取るアクションくらいでしょうか。


② Gameplay Effectを利用して、HPなどを操作する

Gameplay Effectは数値の変更にうっけつけな機能です。

「Cost」という概念があり、あるAbilityを実行するためにはMagic Pointの消費が必要、というようなRPGっぽい実装が設定だけでできます。

また、Effectが二重でかかることを防ぐために、「Cooldown」という概念が存在します。このCooldownの期間中にはEffectが実行されなくなります。このCooldown期間中の実行なども設定することができます。

【今回について】今回はHPと雪玉の個数はEffectで実装したほうがよさそうですね。HP1しかないけど。


③ Gameplay Cueを利用して、Niagaraなどのエフェクトを生成する

これは比較的わかりやすいですね。エフェクトをAbilityに合わせて生成します。

ただ、この範囲はかなり広く、音楽の再生、カメラシェイクなど多岐に渡ります。

【今回について】雪が当たったときの演出、旗を取ったときの演出などに使えそうです。


④ Ability Tasksを利用した、同期・非同期(Async)処理

このAbility Taskが一番面倒、というか概念がわかりにくい部分ではありますよね。

Gameplay Abilityそれ自体は、1フレームで処理が完了するような瞬時の処理しかできません。

なので、実は①のときからAbility Tasksは使用しています。アクションを再生する「Play Montage and Wait」は実はAbility Tasksに該当します。

じつはこのAbility Tasksは非同期処理もできます。つまりあるTagが有効の間、ずっとあるアクションをやり続ける、みたいなことができます。

一個だけ注意点があるのは、このAbility Tasksは同時実行数が1,000個に限定されているので、大規模なオンラインゲームとかを作るときには注意する必要があります。 (どんだけ作るんだよって話ですが)

【今回について】雪玉を作る、投げるときのアクションに使えそうです。


そして、なによりも嬉しいのは、こういった処理を「Authority」のみで実行する、「Client」だけで実行する、「AuthorityもClientも実行するが、操作しているプレイヤー(Local) 優先で実行する」(あるいはその逆) みたいなオンラインゲームで必要な設定がワンクリックでできます。なにも考えなくてもClientとServerで同様の処理を(ほぼ)同時に実施してくれるのは助かりますね。(ReplicationとかRPCをする手間が省けます)

GASをなんで使うのか?ってことなんですが、上記のClient / Server側での処理を分けることが簡単にできること、

及びAbilityの成功、失敗処理を内部でいい感じにしてくれることです。(いい感じってなんやねん)

例えば、誰かに魔法をかける処理をクライアント側でかけたとして、通信がラグっている間にその敵キャラが移動して魔法が失敗したときにどう処理するか?ですね。

これをGASではClient側で処理準備を実行して、成功しそうならそのタイミングでServerに依頼(Predict Key)を出して先に処理を実行しちゃいます。Server側が実行可能と判断したらServer側でも実施します。

一方でServer側が実行不能と判断したらClient側にそれを伝えて、Client側の処理をServer側に近づけるようにフィードバックをかけます。

これをほぼ自動的に実行してくれるわけです。これを手作業でやろうとしたらめっちゃ大変ですよね。


導入

UE5での導入の記事をまとめました。

この記事の内容をクリアすれば、Part1〜Part6でC++をいちいち変更しなくてもよくなります。


下記の記事を大変参考にしました。ありがとうございます。

おかわりのアンリアルなメモ --- GAS界ではかなり有名なブログ記事。

https://okawari-hakumai.hatenablog.com/entry/2018/07/22/165242



その1、GA (Gameplay Ability) を準備してInputとBindする

「死ぬ」「雪玉生成」「マップを見る」「雪玉を渡す」「雪玉を投げる」
5種類のGASを準備

まずは上記5つのGAを準備しました。
このうち、「死ぬ」以外はすべてなんかのキーを押すと発生するイベントなので、キーとGASをバインドしていきます。

おやちょうどいい記事があったので、参照しておきますね。(白々しい)
操作キャラに、各GAを登録して、準備完了です。(結局「死ぬアクション」は使わないかもしれません…)


その2、「投げる」を実装する

さて、ではGA_Throwを実装していきましょう。

Part 2

その3、「投げる」コストを実装する

はい。難関来ました。AttributeとGameplayEffectの実装です。雪玉の個数とHPを実装していきます。

まず下準備ですが、

こちらのおかわりさんのページを基本で組んでいただきます。

https://okawari-hakumai.hatenablog.com/entry/2018/08/03/082935


ただこれではAttributeが、Client側にReplicateされないので、

GASDocumentationを元に、Replicateの設定を行っていきます。


UE5での導入の記事 を導入された方は、C++は弄る必要がないので、BPの部分だけ読んでください。


Part 3


その4、「死」と「再生(リスポーン)」を実装する

難関その2…。

HPが0になったタイミングで発動するイベントをC++で作成し、そのイベントからBPを使って自動リスポーンまで実装していきます。


その5、「味方に雪玉を渡す」を実装する

難関その3…。

ターゲット対象の味方に、雪玉を渡せるようにします。


その6、雪の上だけ雪玉を作れるようにする

今はどこでも雪玉が作れるようになってしまっているので、雪玉を作れるような場所だけ雪玉を作れるようにします。


その7、勝利者のカットインを作る

勝利者を表示するカットインをUIで作ります。イメージはこんな感じ。

Part 7



その8、俺を殺したやつ誰だ…機能を実装する

難関その4…。

自分を殺したキャラクターを数秒表示する機能です。


その9、勝利条件を実装する

難関その5…。

タイマーを実装し、その時点でポイントが高いチームを勝者にします。あるいは旗を取った瞬間にそのチームの勝ちにします。

Part 9を待ってください。


その10、UIを実装する

難関その6…。

UIを実装します。その中で抜粋してお送りします。

Part 10を待ってください。


ステージ作成とかはここで紹介するまでもないと思うので、ここでは載せません。

その他思いついたらここにどんどん記事が追加される(予定)


ゲーム本体作成後

では公開!といきたいところですが、まだまだこれで半分って感じです。

①ログイン処理 --- ユーザーのログイン処理、ユーザーがログインする時に保存する情報の整理

②マッチング処理 --- いわゆるミーティングルームの実装。プレイヤー同士のマッチングをする機能を実装します。

③コンフィグの準備 --- 言語とか、インターフェースを弄れるコンフィグを準備していきます。


ゲーム完成後

ついに完成!さて公開だ!といきたいところですが、実はエンジン改造が必要です。

これに関しては私もやったことがないので、これから学んでいきます。

ここまでたどり着いたらな!!!

参考:

https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/Networking/HowTo/DedicatedServers/