Image courtesy of Mundfish

『Atomic Heart』では Unreal のゲームプレイ アビリティ システムが中心的な役割を果たす

Mundfish CTO Andrey Dyakov |
2021年1月27日
 
Andrey Dyakov 氏は、近々リリース予定の『Atomic Heart』を開発する Mundfish で CTO を務めています。氏のゲーム開発経験は 10年以上に及び、Unreal Engine 3 および Unreal Engine 4 を使う、有名スタジオの AAA 開発に携わってきました。
みなさん、こんにちは。私は Andrey Dyakov です。近々リリース予定の『Atomic Heart』を開発している Mundfish の CTO に就いています。このテックブログでは、『Atomic Heart』を開発するために私たちが利用しているテクノロジーのいくつかを取り上げるとともに、Unreal のゲーム アビリティ システム (GAS) を使うことによって、どのようにして開発プロセスを改善したかを紹介します。 

この記事はマニュアルではなく、私たちの経験を詳細に述べたものですが、GAS に慣れていて、プロジェクトで使用したことがあるデベロッパーには役立つかもしれません。

現在なら GAS に関する資料は豊富に公開されていますが、最初の頃はドキュメンテーションもサポートもまだそれほど多くなく、私たちは GAS について研究する必要がありました。このブログでは、その当時のことから紹介していこうと思います。 

2018年当時のことですが、私たちは、自社製のアクション フィルター システムを使って、プレイヤーのアクションを切り分けるとともに、そのための実行ルールを定義していました。この自社製システムに私たちは概して満足していました。他のアクションを行っている最中に特定のプレイヤーのアクションを開始したり、開始できなくする (たとえば、クラウチング中にジャンプを実行するなどの) アビリティを制御することが可能でした。

しかしながら、これは私たちが必要としていた多くのサブシステムの一つにすぎませんでした。他の重要な開発上の問題を解決する必要もあったのです。たとえば、次のような問題をです。 
 
  • チャージされた近接武器からの酸、電流、火などによる特殊なダメージや、レンジ武器のための弾丸によるダメージをどのように扱うか 
  • 一人のキャラクターに適用されるさまざまなダメージのタイプをどのようにスタックし、処理するか
  • プレイヤー キャラクターの特殊能力をどのように実装するか、および、実行フローをどのように制御するか
  • 『Atomic Heart』をシングル プレイヤーのゲームにすることに最終的に決める前に、私たちはオンライン レプリケーションをどのように処理するか自問していました。

これらの問題をすべて解決できる可能性があるシステムが一つありました。それは、Unreal のゲーム アビリティ システム (GAS) です。私はかつて数週間に渡ってある委託先で 60 人の人たちを対象に UE4 の開発講座を開いたことがあるのですが、その時この GAS を使って、小さなサンプル プロジェクトを作成してみました。しかし、小規模な教育のためのプロジェクトに (当時はまだ) 実験的なシステムを試してみることと、大規模で商業ベースの野心的なプロジェクトで利用してみることは別のことです。 

当初チームはいろいろと不安に思っていましたが、それも無理ありません。当時の GAS に提供されていた Epic によるサポートが限定的なものだったからです。ご存知かもしれませんが、このプラグインが Epic によってリリースされたのは、『Paragon』プロジェクトが終了した後です。最初のうち、GAS は『Paragon』の重要な要素でした。裏を返せば、GAS が当時本番環境にほぼ対応できていたことの証でもあります。私は、当時の限定的なサポートと本番向け使用というギャップをチームが埋めることができると確信していました。そして幸いなことに、その予測は正しかったのです。
GAS プラグインの説明書きには [UNSUPPORTED] (未サポート) のタグが見えます。
Unreal Engine 4.20 がリリースされたころ、コミュニティ内の一部の熱心な人たちによる記事を除き、GAS のドキュメンテーションはネット上にあまりありませんでした。そのような状況で、私たちは独自の研究をすることになりました。私たちのチームは、GAS プラグインのコード一行一行を調べ上げ、ブレインストーミングで利点と問題点をすべて共有しました。

最終的に私たちは、『Atomic Heart』に GAS を組み込むことによって確実に恩恵をもたらしてくれる多数の機能を明確化させました。 
  • あらゆることが Gameplay Tags (階層的タグ) を使って制御できる。
  • すべてのアクション/スキルがアビリティとして開発可能になる。
  • アビリティがプレイヤーの入力にバインドできる。
  • すべてのエフェクト (バフ/デバフ) がスタックし、一緒に計算される。
  • ビジュアル フィードバックが Gameplay Cues によって管理可能になる。

当時の GAS の問題点は明白でした。それは、公式のドキュメンテーションとサポートが不十分であることに加えて、複雑であることでした。GAS は確かに複雑なシステムであり、会社によって、あるいは、プロジェクトによって利用方法がさまざまです。結局、このシステムを使う場合の、私たち自身のベストプラクティスを明確化するのに、私たちも若干時間が必要となったのです。 

GAS を統合しながら、先に挙げた課題のために、基本的な仕組みをすべてチェックしてみると、どれも素晴らしい出来栄えでした。この時点で、私たちのアクション フィルター システムを GAS に完全に置き換えることが可能であるとわかりました。アビリティの実行を制御するための仕組みが私たちのシステムと似ているばかりか、格段に優秀だったからです。置き換えを終えると私たちは、すべてのプレイヤーのアクションを個別のアビリティに移動し始めました。これによって、AHBaseCharacter クラスと AHPlayerCharacter クラス (私たちのクラスには AH というプレフィックスがつきます) が、際立って軽量化されました。

これで私たちは、独自のアビリティ システムのアーキテクチャを設計しなくても、多数のアビリティを作成できるようになりました。これこそまさに時間の節約でした。ただし、追加するアビリティが多くなればなるほど、ゲームプレイの相互連結/依存関係は複雑となりました。  

確かに、初期段階で GAS を使うことに多少の困難があったのですが、だからと言って、独自のシステムを開発実装するほどではありませんでした。
ブレインストーミングの一幕
アビリティとエフェクトのセットアップのためのベストの方式が見つかると、あとは万事順調に進みました。

最終的に私たちは、この新発見した方式を使って、AI キャラクターのアクションを別々のアビリティに移動し始めました。これにより、ビヘイビア ツリーは軽量化し、データドリブン型 AI パイプラインを使ってキャラクターを素早くセットアップできるようになりました。それでは、GAS の活用例をいくつか詳しく見ていきましょう。 

GAS に馴染みのない方に言いますと、通常の GAS のパイプラインには、主要なクラスが 4 つあります。1) オーナーに付属する Ability System Component、2) オーナーのプロパティとして定義される Attribute Set、3) Ability System Component のオーナーに適用可能であり、Attribute Set で定義されるアトリビュートを変更する Gameplay Effect、4) Gameplay TagEffect によって制御されるアクションである Ability です。さらに、Gameplay Task のようなオプションのクラス (Ability のサブ オブジェクト) や、Gameplay Effect からビジュアル フィードバックを供給するのに役立つ Gameplay Cue のようなオプションのクラスもあります。
 

Gameplay タグによってすべてが管理される

そこで、まず何よりも、Gameplay タグについて詳しく説明すべきでしょう。このサブ システムは GAS よりも早い段階で UE4 に追加されました。このタグによって、階層タグ (ラベル) を定義および使用できるようになります。これらは、オブジェクトに適用可能であり、さまざまな用途に利用できます。たとえば、さまざまなタイプのダメージを区別するために利用できます。
 
上の画像では、一般的な Gameplay タグのカテゴリーが表示されています。
私たちの場合は、Gameplay タグの階層を厳密に構成することが非常に重要でした。各アビリティには独自の Ability タグ (Ability サブツリー) と独自の Prohibition (禁止) タグ (Prohibition サブツリー) があります。

すべてを整理された状態に保つことによって、プロジェクト全体でアビリティを使う際に、破綻なく同じアプローチを維持できるようになります。
キャラクターの基本的なアビリティのための Gameplay タグ

Prohibition (禁止) のエフェクト

私たちは、GAS の統合を始めたときに、アクション フィルターと置き換えるのに役立つある機能を使うことにしました。それは、Prohibition (禁止) のエフェクトでした。このエフェクトは、アビリティによって、もしくは、他の場所から直接持ち込むことによって、キャラクターに付加できるものです。その唯一の目的は、アビリティの有効化を阻むタグを付与することでした。

例として RestoreStamina (体力回復) アビリティをあげてみます。このアビリティは、常に、RestoreStamina ゲームプレイ エフェクトを作動させるアクティブなアビリティです。そしてこのエフェクトは無限のエフェクトです。その主な目的は、プレイヤー キャラクターの体力を回復させることにあります。具体的には、プレイヤー キャラクターの AttributeSet 内で定義されている体力属性に 500 ミリ秒毎に float 値を足していきます (AttributeSet とは、GAS コンポーネントのオーナーのあらゆる属性を規定するために必要となる特別なクラスです)。他の何らかのアビリティによって Prohibition タグである Prohibitions.RestoreStamina が付与されるイベントが発生すると、GE_RestoreStamina エフェクトは停止します。これは、そのアセットの設定内で定義されていることによります。 (下の画像参照)
『Atomic Heart』に備わっているほとんどのアビリティは、そのアビリティを禁止する Prohibition タグが適用されると、アクティブ状態から脱します。プレイヤーが 50 以上ものアビリティをもつ『Atomic Heart』のようなゲームでは事が非常に複雑になる可能性があるのです。
 

コスト エフェクト

私たちがどのようにして、タグを利用したアビリティの実行ルール/要件をデバッグしたかお話する前に、コスト エフェクトに関するベストプラクティスも紹介しておきたいと思います。この種のエフェクトが必要となるのは、あるアビリティを実行するのにいくらかのリソースを使わなければならない場合です。もちろん、このようなエフェクトがアビリティのために規定されている場合は、その適用前にチェックされることになります。たとえば、『Atomic Heart』では、超近接攻撃をヒットさせるアビリティには瞬間的な体力コストがかかります。プレイヤー キャラクターに体力が不足していたら、このアビリティは実行されません。十分な体力があれば、このアビリティは実行され、体力はコスト エフェクト内で規定されている値の分だけ減少することになります。

自社製デバッグ ツール

GAS を利用した開発では、多数のアビリティ/エフェクト/タグ/ゲームプレイ キューを簡単に取得できます。だから、新たなアビリティを追加する場合は、そのことをちゃんと考慮しておく必要があります。さもなければ、もろくも「アビリティで立ち往生」状態に陥ってしまいます。この「アビリティで立ち往生」という言葉は、現在アクティブになっているある一つのアビリティによって、他の多数のアビリティがブロックされている状態を表現するために私たちが作った言葉です。つまり、プレイヤーが文字通り何もできない状態に陥る状態を示す用語です。私たちは、このような問題を回避するために、非常にシンプルで必要な情報を含むデバッグ メッセージをビューポートに表示させました。プレイヤー キャラクターに現在適用されているタグとエフェクトが表示されるのです。AI については、同じ情報をもつウィジェットを AI キャラクターの位置に表示しました。ただし、これには個々の AI キャラクターがもつアビリティがともなっています。 
 
この情報があれば、どのタグ/エフェクトをアクティブにすべきか/すべきでないかが簡単にわかります。そのため、たいていの場合、エディタ上の Gameplay Ability アセット内でデータを修正することにより問題は容易に改善できます。
一見カオスに見えますが、各ウィジェットは折り畳むことができ、マウスオーバーすることによってハイライト表示が可能です。

まとめ

ゲームプレイ アビリティ システムは、公式のプロジェクト サンプルライブストリームをともなって再びサポートされるようになりましたが、それまでは、はっきりしない状態にありました。最近は、ますます多くのデベロッパーがこのシステムをプロジェクトに組み込み、コミュニティで知識をシェアするようになりました。

私たちはチームとして、この非常にパワフルでクールな道具が日々の仕事に役立ち、非常に満足しています。このブログで紹介した私たちの経験も他のデベロッパーの役に立ち、刺激になればと思います。

また、開発プロセスに役立つツールを提供してくれた JetBrains に感謝の気持ちを伝えたいと思います。 

開発の進捗状況についてもっと知りたい場合は、Twitter および Facebook で私たちをフォローしてください。また、Steam のウイッシュリストに『Atomic Heart』を追加してください! 私たちのチームに加わりたい場合は、キャリアページまでどうぞ!

    Unreal Engine を今すぐ入手しましょう!

    世界で最もオープンで最先端の制作ツールが入手可能です。 
    Unreal Engine は、あらゆる機能と完全なソースコードがアクセス可能な状態で入手できるため、即座に使い始めることができます。