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

画像



パート1



手続きレベルの生成は、ゲームにコンテンツや予期しないシナリオを追加するための優れた方法です。 MERCストーリーミッションでは、大量の手作りレベルを作成したかったのですが、小さなインディーチームには、このような大きなゲームのコンテンツを作成するための十分な時間やリソースがないことがわかりました。 さらに、ランダム性を追加し、ゲームのリプレイ価値を高めようとしました。 レベルの手続き型生成により、個々のレベルを手動で構築することでは得られなかった、大きく無限に変化する世界を作成することができました。 プロシージャ生成を使用すると、コンテンツを追加してゲームプレイを改善できます。



MERCとは何ですか? MERCは、トップビューを備えたリアルタイムの戦術チームシミュレーターです。 プレーヤーは、ネオトピーの反ユートピア世界で4人のmerc兵のチームを同時に管理し、命令を出し、特別なスキルをアクティブにします。 各merc兵ユニットには、ミッションで使用しなければならない特別な戦闘、技術、ハッキングのスキルがあります。 視覚的には、MERCはブレードランナースタイルに似ています:暗い雨のスラム街と多くの曲がりくねった通りとネオンのある街の屋根。 このプロットは、ネオトピーを支配するための強力な企業の戦争です。 この分遣隊は、科学的な競争相手の誘ductionや亡命者の従業員の殺害など、企業のさまざまなタスクを実行するために雇われています。 受け取った各ミッションは、さまざまな企業との関係に影響を与え、その結果、ゲームの世界を変えます。 これらすべてを踏まえて、手続きレベル生成の要件を見てみましょう。



画像



レベル要件



レベルは都市のスラム街と屋根の迷路ですが、遊びを楽しむためには特別な構造が必要です。 大規模なミッションを作成するために、小さな断片から収集することにしました。 これにより、手動で面白くて「再利用可能な」フラグメントを作成し、手順のランダム性を追加し、各レベルに手作り感を与えることができました。 このため、手続きレベルでは次のことを決定しました。





これらの要件は、ゲームプレイ、世界、ミッションの計画期間を考慮して選択されます。 他のゲームには、手続きレベルのシステムに対する独自の要件があります。 徹底的なレベルの調査により、ミッションをわずか10分で2倍の速度で完了することを望んでいました。 これは、パスの長さの小さな変動が重要なパラメーターになることを意味しました。



最も困難なことは、すべての条件を順守しながら、全体的で興味深いレベルを作成することでした。 どのようにしてこれを達成できましたか? 構造、キャッシュ、ペース、ミッションの目標を備えた完成したレベルを想像すると、これらすべてを手順で作成する方法を理解することは困難です。 レベルをレイヤーに分割する方が簡単だと思いました。 手続きレベルが複数のパスで作成されていると認識する必要があります。各パスはレベルに複雑さの新しいレイヤーを追加します。 基本レベルからプロセスを開始できるのは論理的です。 私たちの場合、これはレベルの構造(ルート)です。



レベルルート生成



手続きレベルのシステムの最初の問題は、行き止まりと短いパスを含む興味深いメインルートの生成です。 Unite 2014のZach Aikmanによる17-BITスタジオによるGalak-Zゲームレベルの生成に関するレポートで解決策を見つけました(レポート全体はこちらでご覧いただけます )。



Zackのレポートは非​​常に興味深いので、ぜひご覧ください。 簡単に説明します。メインの2Dルートを生成するために、修正されたヒルベルト曲線アルゴリズムを使用しました。 興味深いユニークな曲がりくねったルートを作成し、レベルの基礎として理想的です。 Galak-Zの開発者は2次元の側面図でルートに使用し、2次元の上面図を作成するために使用しました。 下の図が、ゲームのストリートマップを上面図で示していると想像してください。



画像

(Galak-Zレポートの図)



メインルートを生成したら、可能なすべてのマップセルを評価して短いパスを作成し、それらの一部をランダムに選択する必要があります。 短いパスでは、マップ全体に沿った動きを減らすことはできませんが、たとえば、一部の敵を避けるために、メインルートの一部を単純にカットします。 短いパスが長すぎて頻繁にならないように、コードに制限を追加しました。 これらの短いパスをレベルのフラグメントに追加するとき、ハッキングされる可能性のあるドアや、プレーヤーのアクションが必要な他の障害物でそれらをブロックすることがよくありました。 これにより、メインレベルのルートにバリエーションが追加され、プレーヤーのスキルをテストする別の方法が提供されます。







次に、マップセルがない場所に行き止まりのサイドパスをランダムに追加します。 ゲームプレイを中断する代替パスを作成し、獲物、隠しキャッシュ、キャラクターの発見や排除などの特別なミッション目標を配置するのに理想的です。 ミッションの目的に応じて、各レベルで1〜3個のデッドロックパスをランダムに生成します。 すべてのミッション固有の目標は、行き止まりの終わりに位置しています。







アイデアは、分遣隊が地図の開始セルにある輸送船に到着し、そこからメインルートが始まるというものです。 次に、player兵を制御しているプレイヤーは、レベルを介して彼らを導き、目標を達成し、メインルートの終わりに到達し、避難します。 各レベルで、ミッションの目標を達成する必要があります。 ミッションの目的はメインルートの外側にあるため、プレイヤーはレベルを探索する必要があります。 他の行き止まりを調査する必要はありません;それらには隠れ場所と追加生産が含まれます。 これにより、プレイヤーに選択肢が与えられます。レベルを突破してミッションをすばやく完了させるか、より多くの時間を研究に費やすことです。



短いパスと行き止まりの完全なルートを生成した後、ロード可能なレベルのフラグメントのリストに変換します。 レベルの各フラグメントはUnityシーンであるため、構成を定義するテンプレートに従って、各シーンに名前を付けました。 レベルを生成したら、マップの各セルをテンプレートに対応するシーン名に変換します。 テンプレートには、フラグメントのテーマ、接続、およびバリエーションの指定が含まれています。 たとえば、テンプレート<topic> _ <メインルートの接続> _ <ショートパスの接続> _ <行き止まりの接続> _ <バリエーション>によれば、レベルフラグメントはシーンの名前「slums_03_-1_-1_A」を持つことができます。



テーマは、レベルフラグメントの視覚的なスタイルです。 1つのテーマのレベルのすべてのフラグメントは、同じテーマの他のフラグメントにシームレスに接続する必要があります。 たとえば、スラムテーマレベル(スラム)のすべてのフラグメントは、接続ポイントで相互に論理的およびグラフィカルに結合する必要があります。 また、 「屋根」 (家の屋根)というテーマを作成しました。この屋根では、互いに接続された道路の代わりに、建物の屋根がランプとフローリングで接続されています。 通常、同じトピックのすべてのフラグメントは同じサイズです。 フラグメントの平均サイズは40x40ユニットです。



ヒルベルト曲線の構造と生成されたパスに従って、レベルの各フラグメントは、 メインルートの 2つの接続、 ショートパスのゼロまたは1つの接続、および行き止まりのゼロまたは1つの接続を持ちます。 レベルのフラグメントには、ショートカットと行き止まりの組み合わせは含まれません。これらは使用されないためです。 各接続は、レベルフラグメントの面に対応し、各面には、下の図に示すように、0から3までの番号が付けられます(「-1」は、存在しない接続を示すために使用されます。たとえば、図に短いパスの接続はありません)。







たとえば、メインルート接続「03」の接続指定を持つレベルフラグメントには、下部(0)と右側(3)に接続があります。 メインパスの接続にマークを付けると、常に拡大の順序が付けられます(つまり、「30」ではなく「03」)。 接続レベルのフラグメントを組み立てるとき、それらは完全に均等に並んでいる必要はないことを覚えておくことが重要です。 一部の化合物に不規則性を追加することにより、ばらつきを増やし、フラグメントの接続の滑らかさを低下させます。 ただし、パスが確実にドッキングされるように、接続は相互に調整する必要があります。



バリエーションにより、レベル設計者は同じレベルフラグメントの異なるバージョンを作成できます。 たとえば、短いルートなしでメインルート「01」を接続する2つのバリエーション「A」と「B」を見てください。 レベルを生成するとき、システムはレベルの各フラグメントのバリエーションの1つをランダムに選択し、視覚的な多様性を高めます。



画像



レベルの各フラグメントをロードするとき、ルート上の位置に基づいて、ワールド内の目的のオフセットに移動します。 これは、Unityで静的バッティング用にマークされたメッシュをフラグメントに含めることができないことを意味します(移動すると、システムが破損するため)。 ただし、Unity Dynamic Batchingはシステム上で正常に機能します。 以下は、ランダムに生成されたレベル構造の例です(赤い領域は建物を通る短い経路であり、青い領域は建物のバリエーションです)。 これは、ファイナライズなしのこれまでの概念チェックにすぎません。



画像



このトピックについてさらに詳しく説明し、提案を喜んで受け入れます。 Twitterで連絡できます。



「UnityでのMERCの手順レベル生成」 記事の第2部では、解決した照明とNavMeshの問題、およびペースに基づいたミッションでのキャラクター生成のプロセスについて説明します。



All Articles