UE の GAS Companion と Blueprint Attributes プラグインを試す

UE の GameplayAbilitySystem (GAS) はとても便利です。

一方で、私はまだまだ理解も浅いです。Lyra や古代の谷などのサンプルの他に、以下のドキュメントが参照先として紹介されるのを見ることがありますが、いつも見ては忘れ、見ては忘れという感じです。

以前は C++ がなければ使えないような機能があり、その当時から GAS Companion を使っていたのですが、同じ作者が Blueprint Attributes というプラグインを公開しているのを知り、今回はそれらを連携させてどういうことができるか試してみました。

Plugins

以下にマーケットプレイスのリンクと Description に加えて、公式のドキュメントとサンプルプロジェクトを一覧します。
いずれもとても丁寧に作られ、更新されていますし Discord での質問も受け付けているようです。

どちらも、GAS で C++ が必要な部分を Blurprint のみで実装可能にしてくれるものではありますが、それに加えて前述の GASDocumentaion で推奨されるようなパターンを考慮した形になっているようです。

今回試すこと

GAS Companion だけでも GAS を使う分には十分なのですが、Blueprint Attributes を使うことで、GAS の Attribute Set を Blueprint で作成することができます。今回はその点を中心に試していきます。

GAS Companion だけだと、https://gascompanion.github.io/api/Abilities/Attributes/GSCAttributeSet/ にある基本的な属性しか利用できず、追加するためには C++ での実装が必要になります。 とはいえ、Attributes Wizard にあるようにウィザードまで用意されているので、「やれば」的な感じではあるのですが。

実際に試す

とりあえず必要なものを揃える

BP_GASStudyCharacter : Thirdperson をコピーしたもので、 GSCModularCharacter に Parent を変更してあるだけです。

以下は、公式のサンプルプロジェクトに入っている Utility のコードなのですが、便利なのでとりあえずコピーします。(一番下の Home ボタンのは私が足したので、不要だと思います)

今回は PlayerController (PC_GASStudy) に貼りました。

まずは GAS Companion だけで Attributes を設定する

BP_GASStudyCharacter の方に設定するだけです。 GSCAttributeSet は GAS Companion からデフォルトで提供されています。

この状態で PIE で Enter を押してデバッグ情報を表示すると以下のようになり、 GAS Companion が提供する AttributeSet が設定できていることが分かります。

UI を付ける

Working with UI

デフォルトの AttributeSet であれば、こちらもデフォルトで提供されている Widget を利用できます。今回は WB_HUD を使いました。

上記を PC_GASStudy に設定すると期待通り表示を確認できます。

自分で UI を作る

先ほどのデフォルトの Widget の親クラスになる GASUWHud を継承して作成できます。

https://gascompanion.github.io/api/UI/GSCUWHud/

今回は WBP_CustomGSCUWHud と名前を付けました。これを先ほどの WB_HUD の代わりに入れても当然何も表示されません。

Widget の内部を作成

https://gascompanion.github.io/working-with-ui/#designing-your-own-widget

ドキュメントの通りですが、デフォルトで提供されている AttributeSet はすでに C++ 側で Text なども準備されており、それをレイアウトするだけになります。今回は Progress Bar は無視して Text 系だけ同じ名前で設定します。

これだけで以下のように UI が表示されました。現状 Max も Current も 0 なので 0 / 0 のような表示になります。

デフォルトの Attribute Set に値を入れる

https://gascompanion.github.io/quick-start/#initialization-with-data-table

ドキュメントの通りですが、Data Table を以下の構造を使って作成します。

DT_Study_Attributes という名前にしました。内容は以下です。ここも Row Name は決まっています。

先ほどの BP_GASStudyCharacter に設定した箇所の下に Data Table を設定できるので設定します。

設定 表示

UI をカスタムし、自分で値を取得し表示する

さて、自動で値が設定されるのは便利なのですが、ここから Attribute を追加したいので、まずは手動で表示してみます。

https://gascompanion.github.io/api/Components/GSCCoreComponent/

そのためには上記の Component を追加する必要があります。

先程の Widget に一列追加し、手動表示の列とします。

tree view

Widget 側の Construct で以下のように初期値を表示してみます。(以下は簡略化のために Health だけです)

お気づきの通りで、 Health など、デフォルトで用意される Attribute に関しては専用の取得関数も用意されています。

以下のように最終列に手動での表示ができました。

UI をさらにカスタムして使う

先ほどは GSCUWHud を継承して使いましたが、見てきた通りでデフォルトで提供される Attribute の Text 等がすでに入っていました。

今回はそれも入っていない GSCUserWidget を使います。

https://gascompanion.github.io/api/UI/GSCUserWidget/

WBP_CustomGSCUserWidget という名前にしました。とりあえず、先程の WBP_CustomGSCUWHud の UI の内容だけコピペしておきます。

次に、スクリプトもコピーしようとしますが、Get Owning Core Component が存在しないエラーになります。

Set Owner Actor を使う

https://gascompanion.github.io/api/UI/GSCUserWidget/#setowneractor

つまり、まだ WidgetGSCCoreComponent を持つ Owner Actor を知らないということです。

とりあえず、Widget のコンストラクタで設定してみます。

うまくいきました。

さて、ここまでで Blueprint Attributes で新しい Attribute を追加した時に表示できそうな準備ができました。(デバッグ表示だけでも良かったのですが。)

Attribute を Blueprint Attributes で作る

コンテンツブラウザから簡単に作れます。 GBA_Study_Attributes という名前にしました。

Armor / MaxArmor を作ります。

Blueprint Attributes には Gameplay Clamped Attribute Data が追加されており、これを利用することで簡単に最大値・最小値に clamp してくれる Attribute を作れます。

さて、この新しい Attribute Set もこれまでと同様に BP_GASStudyCharacter に設定します。

まずはデバッグで確認しましょう。OKですね!

追加した Attribute を UI に表示する

WBP_CustomGSCUserWidget の方で表示してみます。

UI に関しては単にグリッドの最終列に追加しました。

さて、表示ですが Health 等と違って専用の取得ノードは用意されていません。よって以下の Get Current Attribute Value を利用します。

以下のように表示することができました!(Armor の Base 値を 60 にしてしまったので、先程と値が変わっています。)

試してみて

今回はそれぞれのプラグインについてではなく、簡単にそれぞれがうまく噛み合うか確認しました。

GAS Companion と Blueprint Attributes は作者が同じということもあり、ある程度の棲み分けも考えて作られていると思いますが、どちらか単独でも十分に機能するように作られているように思います。

記述できる場所が違う( C++ か BP か、だけでなく)けれど同じことはできるような感じです。一方でこれは GAS を UE のデフォルトだけで書くのも同じ話ではあるので、このプラグイン達を便利に感じるかどうかはチームによると思います。

個人的には、サンプルも通して GAS の使い道を考える上で勉強になることが多かったです。それほど高額なプラグインでもないので検討に値するのではないかと思います。