Image courtesy of Anshar Studios
『Gamedec』が教える、Unreal Engine を使用して複雑な分岐経路を組み込む方法
Anshar Studios Programmer Przemysław Osipiuk
2020年8月17日
Anshar Studios
Gamedec
ゲーム
ブループリント
技術ブログ
Przemysław Osipiuk
Przemysław は、プログラマーとして 1年半の間『Gamedec』の開発チームに加わっていました。担当は、ゲームプレイの作成とデザインチーム向けのツールの作成でした。彼のアイデアによって、デザイナーの作業が容易になる各種ソリューションが作成されています。自由な時間には、新しいテクノロジーに触れ、新たなレゴブロックを組み立てることによって、常に創造的であろうとしています。
『
Gamedec
』は、シングル プレイヤーによる非戦闘型サイバーパンク アイソメトリック RPG です。プレイヤーは、仮想世界内で犯罪を解決する私立探偵である Gamedec になります。プレイヤーの決定によってキャラクターの特性が変わり、ゲームの進行も影響を受けますが、事件はジレンマに満ちており、めったに明快なものではありません。プレイヤーは、選択の積み重ねとして存在するのです。
『
Gamedec
』は、複雑で大量のダイアログ (会話) と決定分岐に基づいたゲームです。1 つの決定によって、問題を解決する道が開かれることがありますが、別の道を妨げることもあります。これほどの複雑さが備わったゲームを作成するには、特別なツールが必要です。私たちは、Unreal Engine とともに、Articy を使用しています。
Articy
は、視覚的に一貫しているツールで、ゲームのライティング/計画/コンテンツ管理を包括的に行えるソフトウェアです。
画像協力: Anshar Studios
上は、『Gamedec』の分岐経路の一例です。
目的
『Gamedec』の世界を生き生きとしたものにするために、デザイナーたちに必要となったのは、豊かなダイアログを通じてゲームに影響をもたらすことだけではありませんでした。NPC の動きや、世界の変化、雰囲気のある音楽などを利用しなければなりませんでした。プレーヤーは、膨大なテキストをクリックしているだけではなく、ゲームと本当にインタラクトしていると感じる必要があるのです。
最初、『Gamedec』のチームには難題がありました。プレイヤーの選択に基づいてワールドに影響を与えるためには、Technical Name (技術名) と呼ばれる Articy のオブジェクトを表すユニークなシーケンスに頼る必要がありました。
このアプローチには欠点がいくつかあります。レベル ブループリントを少し調べるだけでは、特定の Technical Name で表されているのはどのダイアログの断片なのか分からず、どこで呼び出され、どのようなことが行われるのかも分からないのです。だから、Articy を開き、その Technical Name がついているノードを見つけ、ブランチを分析して、ゲームで何が起こるのか理解しなければなりません。さらには、Articy しか使わないチームメンバーには、Unreal Engine でその動作をトリガーするノードがどれであるのか、はっきりした情報がありません。
画像協力: Anshar Studios
ダイアログの選択に応じてイベントを実行するために私たちがとった最初のアプローチは、上のように Switch ノードによるものでした。
画像協力: Anshar Studios
上は、『Gamedec』の分岐経路の一例です。
2 番目の問題ははっきりしています。Unreal Engine でイベントをトリガーするノードを別なものにデザイナーが変更するときに、レベル ブループリントで Technical Name を変更する必要があるという問題です。ゲームを作成するには (特にダイアログやインタラクションが多いゲームを作成するには) 、非常に反復的なプロセスが必要となります。複数の場所で同時に変更を加える必要があるため、ミスするリスクが高くなり、その分多くの時間がかかる可能性があるのです。
解決策
これらの問題に対処するために、Articy には、関数を実行できる非常に便利なメカニズムが提供されています。命令ブロックに関数呼び出しを挿入することによって、チームが対処しなければならなかった上記のような問題が解消されるのです。
画像協力: Anshar Studios
命令ブロックが問題を解決
命令ブロックがこの問題の解決策です。このような機能の第一の利点は、そのアクティビティがいつ実行されるかデザイナーが正確に把握できるということにあります。命令ブロックの場所を変更しても、Unreal Engine で変更する必要がないということが重要です。ダイアログ内の別の時点ですでに定義されている関数を呼び出すのです。
独自の関数を使用することには、大きな利点があります。 ゲームプレイのプログラマーは、ブループリントのレベルでどんな些細なアクションでも定義する必要がなくなります。私たちは、多数の関数を作成することにより、ダイアログを作成しながら、Articy のレベルからゲームを簡単に制御できるようになりました。
たとえば、話し相手の NPC に、ある場所に連れて行ってもらいたい場合は、GoTo と FollowBy という 2 つの命令を使って実現できます。その際、位置や歩行速度といった必要なパラメーターも渡します。
画像協力: Anshar Studios
上のカットシーンは、ダイアログの選択によって起動します。
実装
もちろん、Articy は、
Locations_TheaterDoor
(劇場のドア) のようなものがどこなのか、どの NPC が
Characters_Admin
なのかは分かりません。Unreal Engine で定義する必要があります。そのため、私たちはアクタをシステムに登録できるコンポーネントを作成します。
画像協力: Anshar Studios
上の画像にある劇場のドアは、Locations_TheaterDoor として登録されました。
システムは単純です。レベルが開始されると、このコンポーネントが入っているすべてのアクターが、このデータを辞書に格納しているオブジェクトに登録されます。そのキーは所定の識別子であり、その値はアクタへの参照です。
では、Articy と UE4 の結びつきはどのようなものでしょうか?そして、それらの関数はどのように機能するのでしょうか?まず、関数を命令ブロックに入れると、Articy から Unreal Engine にデータをインポートするプラグインによって、Articy で使用されるすべての関数の定義を含む UserMethodProvider インターフェイスが生成されます。
画像協力: Anshar Studios
上のプログラムは、生成されるインターフェイスの断片です。
生成されたインターフェースに、ユーザー作成の利用可能な関数のセットが常に含まれるようにするために、私たちは、引数をともなった定義済み命令がすべて含まれている Articy フロー セクションを作成しました。これは実行されることはありませんが、エクスポートに回されるため、すべての関数がどこにも使われなくてもインターフェイスに含まれるようにできます。こうすることで、後で問題を回避できるようになります。Unreal Engine にとっては、一種の API の宣言のようなものです。
画像協力: Anshar Studios
利用可能な関数のセットを含んでいるフローの一部です。
Unreal Engine 用の Articy プラグインには、
UAArticyFlowPlayer
クラスが含まれています。これによって、ダイアログのツリー内を移動し、ダイアログのブランチを探索することが可能になります。このクラスには、アクタまたはコンポーネントのいずれかが上記インターフェイスを実装しているかどうかを確認できる関数が置かれています。大雑把に言えば、それだけのものです。さてこれで、
UserMethodProvider
インターフェースを実装するコンポーネントを作成して、関数の動作が定義できるようになりました。
『Gamedec』では、インターフェイスをより小さなものに分割しようと思いました。機能の追加という圧力が絶え間なく続いており、規模が大きくなり始めていたからです。そこで、1 つのグループの関数のみを含む小さなインターフェイスを作成しました。そして、ファサードを作成することによって、基本インターフェイスを実装するとともに、関数の実行をそれぞれのオブジェクトにデリゲートしました。このようなソリューションによって、システムをより小さな断片に分割し、全体の論理的整合性を維持できるようになります。
さらに、特定のイベントに反応するクラスを複数登録できます。私たちが遭遇した問題には、同じ関数が繰り返し実行されるということがありました。これは、ツリーをトラバースするアクションの特異性に起因しています。FlowPlayer は、考えられるすべてのパスを分析してから、特定のダイアログ ブロックを実際に実行します。これは、特定のブランチに入って、使用可能なオプションのリストを表示できるかどうかを判断するために満たすべき条件に関係しています。
しかしこの場合、Shadow Mode という Articy の機能が役にたちます。現時点では、Articy がツリーを分析することで利用可能なブランチを確認する場合、この特別な (Shadow) モードに入ります。それによって、変数とゲームプレイは影響を受けません。あるノードについて完了すると、Shadow モードではなくなり、そうなって始めて関数が実行できます。このことは本当に注意しなければなりません。
画像協力: Anshar Studios
問題
Articy で独自の関数を使用する場合、ある問題が関わってきます。Articy では、そのままでは、独自の関数を構文チェックするメカニズムが提供されていないのです。デザイナーは、使用されている関数が存在するのかどうかの情報を持っていません。関数に渡される引数が Unreal Engine での実装と一致しているかどうかについても分かりません。しばらくの間、このことは一種の問題となっていました。
Articy のどの変更が日々のビルドを駄目にしているのか数時間分析することもありました。
原因としては、関数名の単純なタイプミスだったり、引数のタイプミスだったり、引数の数の不一致の場合がありました。また、ログを分析することによって素早く把握できるエラーの場合もありました。あるときは、ブロックの最後の関数にセミコロンを付け忘れていることもありました。通常なら、これは問題になりません。インポーターによって関数の最後に欠落しているセミコロンが追加されるからです。しかし、この場合は、関数にセミコロンを追加し忘れ、さらに、関数の後ろにコメント ブロックを追加していたのでした。
問題のある命令の例:
CallEvent("OpenHiddenRoom")// Open the secret room
この問題は、ログを分析してもすぐに見つけられませんでした。エラーがまったく別の場所を指し示していたからです。そのため、私たちは、すべての変更とそれらに対するコメントを苦労して分析することによって、エラーを見つけるはめになりました。最後の関数の最後尾にセミコロンを追加し忘れて、コメント ブロックを追加し、さらに、Articy からデータをインポートするためのプラグインを追加すると、エンジンでバグが発生しました。返り値の型が void から object に変更され、その結果、コンパイル エラーが発生したのです。
その日私たちは、そのような状況が繰り返されるリスクをゼロにするか、少なくとも最小限に抑えてみようと決心しました。残念ながら、Articy では、ユーザー作成の関数のためのヘッダーを定義することができません。実際上、デザイナーは構文チェック機能をもっておらず、間違いを犯す可能性があります。
しかし、Articy では、独自のプラグインを作成することが可能です。そこで、すべての命令ブロックを分析することによって関数を見つけ、定義と互換性があるかどうかをチェックするプラグインを作成しました。このプラグインは、Articy を多用するチームのすべてのメンバーにインストールしました。その瞬間から、この問題は日々のビルドで発生しなくなりました。
画像協力: Anshar Studios
最後に
ゲーム開発では、あらゆる決定が重要となります。たとえば、ソフトウェア、ツールチェーン、ソフトウェア アーキテクチャに何を選択するか、などもそうです。インタラクションを作成するためのツールとして Articy を選択したこと、そして、それをユーザー作成の関数と独自のプラグインによって拡張したことは、私たちにとって正しい選択でした。Unreal Engine 用のエディタ ユーティリティ ウィジェットを作成する機能があるため、私たちは、Articy と UE4 間のインタラクションをデバッグするためのツールを素早く開発することができました。これは、ゲーム開発には不可欠なものでした。作業を簡素化することもタイムリーに決定できたため、インタラクションをより高速にイテレートできるという具体的なメリットがチームにもたらされました。同時に、プログラマーの手を借りることなく、プレイヤーにやる気を起こさせるプロトタイプを迅速に作成できるというメリットも得られました。
ゲームプレイのフローを Articy で作成されたダイアログから直接制御しながら、ブループリントを使用することによって、ゲームのプロトタイプは素早く作成できます。そのため、『Gamedec』のような選択主導型のゲームを作成する場合、この 2 つのツールは素晴らしい組み合わせとなります。これにより、デザイナーは、プロジェクトに加えられた変更が正しくストーリーに反映されているか確認できます。
デザイン面について言えば、クエスト デザイナーは、Unreal Engine でインタラクティブなスケルトンを作成する場合、プログラマーやグラフィック デザイナーといったチームの他メンバーの助けを必要としません。クエスト デザイナーは、自分たち自身で行い、調整し、イテレートできるのです。これは実に素晴らしいことであり、多大な時間を要するメンバー間のやり取りが必要なくなります。Articy は、Unreal Engine と組み合わせて使うことによって、多くの仕組みとツールが利用できるため、最適なやり方で『Gamedec』の開発ニーズに合わせることができるのです。
Unreal Engine を今すぐ入手しましょう!
世界で最もオープンで先進的な制作ツールが入手可能です。
Unreal Engine では、あらゆる機能と完全なソースコードがアクセス可能な状態で入手できるため、すぐに使い始めることができます。
今すぐ始める