UnityでのMERCの手続きレベルの生成





パート2



この記事の最初の部分では、 MERCゲームに手続きレベル生成を選択した理由と、その要件について説明しました。 また、手続きレベルの構造を生成し、多くのフラグメントを組み合わせて全体的なレベルを作成するプロセスについても説明しました。 記事の第2部では、Unityの照明とNavMeshの問題を解決し、ペースに基づいてNPCを作成する方法について説明します。



照明



手続き的に生成されたルートを作成する場合、各レベルで1つのフラグメントが複数回ダウンロードされる可能性が非常に高くなります。 このようなフラグメントの複製メッシュはメモリに個別に保存されますが、すべての照明マップのマージコードをシーン名でレベルローダーに追加することで、 照明マップを共有できます。 次に、ロード中にライトマップインデックスが再割り当てされ、メモリが節約され、これらのフラグメントのライトマップインデックスは複製されません。



レベルフラグメントの座標がベイク処理されたライティングとシャドウに対応するように、同じライティング設定で1つのテーマの各シーンをベイク処理しました。 「スカイボックス」「アンビエントソース」設定を使用すると、各フラグメントの照明がわずかに異なり、フラグメントが接続されると継ぎ目がはっきりと見えることがわかりました。 明らかに、これは私たちに合わなかったので、最適なオプションを見つけるためにさまざまな照明パラメーターを実験しました。 「アンビエントソース」「グラデーション」に変更すると、最良の結果が得られることがわかりました。 接合部はほぼ完璧で、縫い目は見えませんでした。 下の画像は違いを示しています。



画像



MERCの手続きレベルを生成するとき、すべてのフラグメントの前に1つの「親」シーンをロードしました。 このシーンには、リアルタイムライティングに使用される1つの指向性光源があり、フラグメントと同じパラメーターでベイク処理されています。 このシーンには、最終レベルに必要なすべてのグローバルオブジェクトとパラメーターも含まれていました。 フラグメントをロードするとき、Unityシーンマネージャーでこの親シーンを「アクティブな」シーンにし、そのパラメーターがシーン全体で使用されるようにします。



ナブメッシュ



NavMesh Unityを使用して、すべてのmerc兵とNPCをルーティングします。 この手続き型システムを開発したとき、Unityエンジンは、ゲームの実行中に複数のNavMeshの動的な結合をまだサポートしていませんでした。 Unityでは、この機能はバージョン5.6からの新しいベータ版に追加されましたが、執筆時点ではまだ準備ができていません。 したがって、レベルのいくつかのランダムなフラグメントをロードし、それらを1つのNavMeshとともに適用することにより、問題を解決する必要がありました。 Unity開発者自身のレビューによると、これを達成する唯一の方法は、単一の大きなNavMeshエリアを作成し、それをレベルの各フラグメントにカットすることでした。 したがって、親シーンでは、プレイエリア全体をカバーする1つの大きなフラットNavMeshを作成しました。 次に、Unity NavMeshObstacleコンポーネントを使用して、すべての壁とプレハブを切り取りました。 次に、NavMeshにロードされ配置されると、NavMeshから切り取られ、メインルートのみが移動のために残されます。



このシステムは非常にうまく機能し、レベルのロード時間にはほとんど影響しません。 主な制限は、親シーンにある1つのフラットなNavMeshの一部を切り取るため、レベルフラグメントでNavMeshの標高を変更できないことです。 どのフラグメントがロードされるかを事前に知る方法はないため、各レベルの構造はランダムで動的であるため、NavMeshにアップグレードを埋め込むことはできません。 将来Unity 5.6にアップグレードした後、システムを改善して、異なるリフトを持つ複数のNavMeshの結合をサポートするようにします。



画像



各フラグメントをロードしてパスをプロットした後、フラグメントに変動性を追加して、重複したフラグメントが同じように見えないようにしました。 これを行うために、 手続き障害物ボリュームを作成し、レベルの各フラグメントで装飾とカバーのランダムオブジェクトを生成しました。



プロシージャル障害ボリューム



プロシージャル障害ボリュームは、シェルターオブジェクトのランダムに選択されたプレハブが生成されるスペースの量です。 重複フラグメントをロードする場合でも、レベルフラグメントに可変性を追加できます。



最初に、各プレハブに追加されるProceduralObstacleコンポーネントを作成しました。これは、システムからダウンロードできます。 このコンポーネントは、プレハブの境界、ラベル、その他の設定のサイズを監視します。 プレハブがエディターで更新されるたびに、グローバルScriptableObjectマニフェストで自動的に更新されます。 このマニフェストは、手続き型ボリュームに読み込むときにプレハブをチェックするために使用されます。



画像



次に、 Procedural Obstacle Volumeゲームオブジェクトをレベルフラグメント内に配置します。 これらのボリュームには、ラベルと方向に基づいて生成できるプレハブを選択できる設定があります。 たとえば、破壊可能で、特定の方向にのみ避難するオープンスペース用のプレハブのみでエリアを埋めることが必要な場合があります。 レベルをロードすると、これらのボリュームが処理され、適切なプレハブがランダムに選択されます。 この処理はすべて、レベルを生成するシードに基づいています(したがって、プロセスは決定論的であり、ネットワークでの共同プレイに適しています)。 次に、標準のビンパッキングアルゴリズムを使用して、プレハブをボリューム内にできるだけ小さく配置し、to兵がそれらの間にパスを作成できるようにします。



画像



時間の経過とともに、レベル設計者の作業を簡素化する他の機能をシステムに追加しました。 たとえば、ゲームを開始しなくても、エディターでボタンをクリックするだけで、どのプレハブをボリュームにロードできるかを確認できます。 そのため、設定に基づいてボリュームにロードできるものをすばやくテストできます。



画像



レベル、障害物、照明設定、NavMeshでのルートの生成が完了したので、レベルを敵で満たす必要があります!



NPCとテンポカーブ



MERCの各レベルフラグメントを作成するとき、NPC作成ポイントを各フラグメント内に戦略的に配置しました。 ただし、ゲーム中にすべての敵を作成したくはありませんでした。実際の肉挽き機になります。 代わりに、手続きレベルを読み込むときに、 テンポカーブに基づいてどのポイントを含めるかを決定します。



テンポ曲線は、レベルのテンポの「パルス」を反映するために思いついた単純な概念です。 Unityのアニメーションカーブグラフを使用して、レベルを完了することがどれだけ簡単か難しいかを制御できます。 以下に例を示します。



画像



手続き型ミッションをロードするとき、基本的なミッションの複雑さがあります。 リストからランダムにテンポカーブを選択し、相互に相対的なカーブのポイントを評価します。 これは、ポイントがチャートのどこにあっても、最も低いポイントを見つけてゼロまたはレベル「敵を作成しない」と見なすことを意味します。 それから彼は最高点を見つけ、それを「最も難しい」レベルと見なします。 次に、次のように最低点と最高点の間で同じ増分で中間難易度修飾子を配布します。





たとえば、メインルートが9つのフラグメントで構成されている場合、上記のテンポカーブのポイントは、レベルの最初から最後まで分布します。 最初のフラグメントには「敵を作成しない」修飾子が割り当てられ、4番目のポイント(または7番目のフラグメント)は「最も難しい」修飾子、最後のポイント(または最後のフラグメント)は「敵を作成しない」です。 他のすべてのフラグメントは曲線のポイントに沿って分布し、これらのフラグメントでのNPC作成の割合を決定します。 結果は、NPCの複雑さに関連してレベルを渡す「パルス」です。 上記のチャートはゆっくりと成長しており、メインパスが終了する前に次第に大規模な戦いを迎えています。 この例のほとんどすべてのフラグメントでは、最初と最後のフラグメントを除いてNPCが作成されるため、敵は常にそのレベルに存在します。



MERCのNPCは、ポイントシステムを使用して作成されます。 現在の分隊レベルとミッション難易度に基づいた完全なスコア表があります。 それから、NPCを作成するときに費やす必要があるポイント数を決定します。 難易度修飾子が「基本」に等しい場合、選択したミッションの難易度の分隊レベルに対応するNPCが作成されます。 修飾子が「Simple」または「Simplest」に等しい場合、NPC作成時のポイントの一部が差し引かれます。 同様に、「Complex」と「Most Complex」はポイントを追加して敵を作成します。 作成の時点で、これらのポイントを使用して、作成されるNPCの数とレベルを決定します。



メインルートはテンポカーブに基づいてNPCで満たされますが、テンポカーブをランダムに選択して行き止まりへのパスを制御します。 したがって、レベルの通過は、プレイヤーが選択したパスに応じて異なる場合があります。 そのような混合物は、手続きレベルのシステムのより大きな変動性と再現性を提供します。



まとめ



MERCは、繰り返しのウォークスルー用に設計されたゲームです。 したがって、彼女はレベルの手続き生成システムの使用から大きな利益を得ます。



メインルートの作成とレイヤーのオーバーレイから開始し、次の要件を考慮して、開発プロセス中に調整および構築できる信頼性の高いシステムを構築し、新しいゲームプレイの仕組みを追加しました。 すべてのランダム値の計算に1つのシードを使用することにより、ネットワーク上で一緒にプレイするために複製できるすべてのデータの決定論的な生成を保証します。 このシステムのさまざまな側面について詳しくお伝えできることをうれしく思います。提案やフィードバックを喜んで受け入れます。 Twitterで私に連絡できます。



現在、MERCはSteamの早期アクセス段階にあり、フィードバックとサポートを歓迎します。



MERC手続きレベルのロードの例、トップビュー:



画像







All Articles