タワーディフェンステンプレートのステージの設定

確認済のバージョン: 2017.2

-

難易度: 中級

はじめに

さまざまな効果を持つタワーや敵エージェントを作成したので、次に、プレイヤーが敵から陣地を守るためにタワーを建てられるステージを設定しま。

プロトタイプレベル

ゲームを作成するときに、プレースホルダーのアートアセットを作成して早期にデザイン作業をテストすることには十分な価値があります。これにより、設計を変更する必要が生じた場合にアートの変更に時間や労力を費やす以前に、システムとレベルの設計が意図どおりに機能するかを確認しておくことができます。

開発プロセスのこの段階を示すために、スターターキットにはステージ 1 のプロトタイプバージョンが含まれています。プロトタイプステージはステージ 1 とほぼ同じです。ただし、環境アートはゲームで再生する最終バージョンよりも遥かに単純です。 最終段階の複雑なゲーム世界のジオメトリの代わりに、プロトタイプはすべて Unity エディターで利用可能な 3D プリミティブで構成されています。

プロトタイプから最終段階に進むとき、リリース品質を作るために以下の技術的な点が考慮されました。

メッシュの拡張

ステージモデルは拡張され、プレイヤーがプレイエリアの境界の外に決して出ないようにしました。

ステージのメッシュ結合

ステージのメッシュは、大きすぎないように細かく分割しました。 カメラの錐台よりもはるかに大きいメッシュは効率的ではありません。なぜなら、多くの頂点が画面外に描画されるからです。小数のメッシュの集合でステージを維持してドローコールや錐台のカリングのコストを最小限に抑えつつ、メッシュが大きくなりすぎるのを回避することが大切だからです。

コリジョンメッシュ

近似コリジョンメッシュを作成しました。 これにより、弾丸がステージのオブジェクトにヒットします。また、タワーを配置するときにカーソルをステージ上に表示するためのものです。

表示されない面の削除

表示されない面はゲーム世界のオブジェクトから削除しました。 大抵の場合、これにはオブジェクトの一番下にある面が含まれます。 これらの面を削除すると、特に低性能デバイスでパフォーマンスを低下させるオーバードローを削減できます。

プロトタイプのアートアセットから最終的な高品質のアセットに移行する場合は、上記を考慮する必要があります。上記を行うことによって、パフォーマンスが良く、管理しやすいステージになります。 これらのステップを経て作成されたステージには、正しく動作するために必要なすべてのオブジェクトとコンポーネントが含まれているはずです。

このチュートリアルの残りの部分では、空の Unity のシーンからステージを段階的に作成することに焦点を当てており、高品質のアートアセットを作成する手順はあまり含まれていません。

レベルリスト

メニューシステムを通じてプレイヤーがステージにアクセスできるようにするには、レベルリストを作成してステージを加えます。これを行うには、以下の手順で行います。

  • Project ウィンドウから Create > Starter Kit > Level List を選択します。

  • LevelList スクリプタブルオブジェクトにステージの詳細を加えます。

ステージがゲームの Level Select メニューに表示されます。 (訳注:Tower Defense Template パッケージをインポートすると、設定済みの LevelList スクリプタブルオブジェクトのアセットがインポートされます。Project ビューで「LevelList」を検索すると見つかります。詳しい設定についてはこちらのアセットも参考にしてください)

LevelList スクリプタブルオブジェクトを理解する

レベルリストを使って、メインメニューに表示するステージの数を設定し、各ステージの以下の情報を設定できます。

ID

メニューに表示されるステージの順番。

Name

ステージのタイトル。

Description

プレイヤーにステージの特徴を説明する短い文。

Scene Name

ステージを含むシーンの名前。

ジオメトリの設定

  • 以前作成した空のシーンに大きな平面を加えます。Hierarchy ウィンドウから Create > 3D Object > Plane を選択します。

  • Plane の Transform の Position は必ず (0, 0, 0) に設定します。

  • 3D オブジェクトをステージに加え、レイアウトを作成します。キューブとシリンダーが最も適切です。Hierarchy ウィンドウから Create > 3D Object > Cube/Cylinder を選択します。

すでにより複雑なメッシュを作成している場合は、この手順を飛ばして代わりにそれを使用できます。

NavMesh の設定

ステージジオメトリを移動可能にするためには、NavMesh をベイクする必要があります。

  • Planeかステージメッシュを選択します。

  • Navigation ウィンドウの Object タブを開きます

  • Navigation の Static オプションにチェックを入れます

  • Navigation Area を Walkable に設定します。

  • エージェントが通り抜けすべきでない 3D オブジェクトを選択します。

  • Navigation ウィンドウの Object タブを開きます

  • Navigation の Static オプションにチェックを入れます

  • Navigation Area を Non-Walkable に設定します。

* NavMesh をベイクします。

ナビゲーションノード

敵をステージ上で移動させるには、点から点に移動できるようにノードを設定する必要があります。ノードはまた、エージェントが発生する地点と、エージェントが到達するとプレイヤーの本拠地がダメージを受ける地点を定義するためにも使用されます。

空のゲームオブジェクトに Node コンポーネントを追加することでノードを作成します。 これにより、エージェントが発生する地点を定義するメッシュを作成でき、エージェントがノード領域内のランダムな点を選択して移動できるようになります。ランダムな点を選択できるようになったため、エージェントが 1 箇所に固まることがなくなります。

  • 空のゲームオブジェクトを作成し、Navigation Nodes か、それに似た名前を付けます。

  • 空のゲームオブジェクトを作成して Navigation Nodes の子にし、StartNode と名前を付けます。

  • StartNode ゲームオブジェクトに Node コンポーネントを加えます。

  • Select/Add Mesh ボタンをクリックします。

  • 子ゲームオブジェクトのメッシュを調節して適当な形状にします。

  • StartNode ゲームオブジェクトに Sphere Collider か Capsule Collider コンポーネントを加えます。

  • Is Trigger にチェックを入れます。

  • Collider にノードメッシュが含まれていることを確認します。

Node コンポーネントを使用すると、新しいメッシュを加えることができます。Node コンポーネントは Area Mesh Creator コンポーネントを使用して子オブジェクトを作成します。ここで、プリセットの形状を定義したり、シーンビューで点の間をクリックしてメッシュに点を追加したりできます。 Shift キーを押しながらクリックすると、点を削除できます。

シーケンス内で次のノードを定義するには、ノードを選択するコンポーネントを追加する必要があります。Fixed Node Selector は敵を特定のノードに移動させます。また、 Random Node Selector は使用可能なノードのウェイト付けされたリストから選択します。

  • 上記の手順を使用して別のノードを作成します。

  • StartNode ゲームオブジェクトに FixedNodeSelector コンポーネントを加えます。

  • Linked Nodes に Element を追加し、作成したフィールドに新しいノードをドラッグします。

上記の手順を必要に応じて繰り返すことができます。エージェントがノードを移動する順にノードをリンクし、レベルを通って思った通りの経路をたどるようにします。

タワー配置エリア

スターターキットのタワーには、プレイヤーがステージ内にタワーを配置できるようにするために IPlacementAreas が必要です。 空のゲームオブジェクトに IPlacementArea を実装した後、タワーの配置場所を定義することができます。

スターターキットには、IPlacementArea の 2 つの実装が含まれています。

SingleTowerPlacementArea

SingleTowerPlacementArea は、タワーを 1 つだけ配置できる IPlacementArea です。

  • 新しいゲームオブジェクトを作成し、それを TowerPlacementArea と名付けます。

  • Sphere Collider を TowerPlacementArea オブジェクトに加えます。

  • SingleTowerPlacementArea コンポーネントを TowerPlacementArea オブジェクトに加えます。

  • Prefabs/UI の SinglePlacementTile プレハブを Placement Tile Prefab フィールドにドラッグアンドドロップします。

  • TowerPlacementArea のレイヤーを PlacementLayer に設定します。

TowerPlacementGrid

TowerPlacementGrid は、プレイヤーが複数のタワーを配置できるグリッド状のエリアです。

  • 空のゲームオブジェクトを作成し、PlacementGrid と名付けます。

  • TowerPlacementGrid コンポーネントを加えます。

  • グリッドに任意の Dimensions を設定します。

  • Prefabs/UI の PlacementTile プレハブを Placement Tile Prefab フィールドにドラッグアンドドロップします。

SingleTowerPlacementArea とは異なり、入力処理のために正しいサイズに設定されたコライダーが自動的に作成されます。

本拠地を配置

敵は、最終ノードに到達したときにプレイヤーの耐久力を奪いません。この問題を解決するには、最後のナビゲーションノードをいくらか変更する必要があります。

  • PlayerHomeBase コンポーネントを最後のノードゲームオブジェクトに加えます。

  • PlayerHomeBase の Max Health と Starting Health を設定します。

  • Player (SimpleAlignment) スクリプタブルオブジェクトを Alignment フィールドにドラッグアンドドロップします。

Player Home Base にはパーティクルシステムを割り当てるフィールドがあります。1 つはチャージショットの効果用、もう 1 つは攻撃の効果用です。これらは必須ではありません。

PlayerHomeBase コンポーネントを理解する

Configuration

Max Health

プレイヤーの本拠地の最大耐久力。

Starting Health

開始時のプレイヤーの本拠地の耐久力。

Alignment

どちらのオブジェクトが本拠地を標的にしダメージを与えるかを定義するスクリプタブルオブジェクトを参照します。

Charge Pfx

エージェントが本拠地を攻撃するためにチャージしている間に、パーティクルシステムが再生されます。

Charge Sound

エージェントが本拠地を攻撃するためにチャージしている間に、サウンドが再生されます。

Attack Pfx

エージェントがチャージを終え本拠地を攻撃するときに、パーティクルシステムが再生されます。

Attack Sound

エージェントがチャージを終え本拠地を攻撃するときに、サウンドが再生されます。

これが割り当てられている場合、ダメージが加えられると攻撃の効果が再生されます。

Tower Library を加える

タワーを配置するエリアを作成したので、そのステージでどのタワーが使用可能なのかを設定する必要があります。

  • Project ウィンドウから Create > Tower Defense > Tower Library を選択します。

  • このステージでプレイヤーが利用できるタワープレハブをドラッグします。

ウェーブの設定

敵を発生させるために、ウェーブを設定する必要があります。

  • 空のゲームオブジェクトを作成し、Wave Manager と名付けます。

  • Wave Manager オブジェクトに WaveManager コンポーネントを加えます。

  • Size フィールドに発生させるウェーブの数を入力します。

ウェーブを作成する代わりに以下を行うこともできます。

  • 空のゲームオブジェクトを作成し、Wave1 と名付けます (必要に応じて数字を変えます)。

  • Wave1 に Wave コンポーネントを加えます。

  • Spawn Instructions 下の Size フィールドに、ウェーブで発生させるエージェント数を入力します。

  • 各エージェントに対し、

    • 敵のタイプの AgentConfiguration スクリプタブルオブジェクトを Agent Configuration フィールドにドラッグアンドドロップします。

    • Delay To Spawn フィールドに、エージェントが発生してから次のエージェントが発生するまでに何秒の間隔をあけるかを設定します。

    • エージェントが発生するノードを Starting Node フィールドにドラッグアンドドロップします。

通常の Wave コンポーネントは、すべてのエージェントが破壊された後にのみウェーブを終了します。TimedWave コンポーネントの使用も可能です。TimedWave コンポーネントには Time To Next Wave フィールドがあり、次のウェーブでエージェントが生成されるまでの一定時間の間隔を設定できます。

ウェーブを作成したら、WaveManager の Wave の下にある Element に加えます。

Game Manager を加える

プレイヤーがすべての敵を倒すか、本拠地の耐久力が底をついたときにステージが終了するためには、ゲームオブジェクトに Game Manager コンポーネントを加える必要があります。

  • Prefabs/Manager にあるスターターキットのデフォルトの GameManager プレハブを Hierarchy ウィンドウにドラッグアンドドロップします。

  • LevelList スクリプタブルオブジェクトを Level List フィールドにドラッグアンドドロップします。

GameManager コンポーネントを理解する

Game Mixer

ゲームで使用されるオーディオミキサーへの参照を格納します。

Master Volume Parameter

ゲーム全体の音量を制御する GameMixer のパラメーター名。

Sfx Volume Parameter

ゲームのサウンドエフェクトの音量を制御する GameMixer のパラメーター名。

Music Volume Parameter

ゲームの音楽の音量を制御する GameMixer のパラメーター名。

Level List

ゲームに含まれるステージのリストへの参照を設定します。

Level Manager を加える

LevelManager はゲームの状態を管理し、ステージの他の重要な機能 (例えば、最初にプレイヤーに与えられる通貨の量など) を設定することができます。以下の手順でそれを加えます。

  • LevelManager コンポーネントを以前に作成した Wave Manager ゲームオブジェクトに追加します。

  • Starting Currency フィールドを設定します。

  • TowerLibrary スクリプタブルオブジェクトを Tower Library フィールドにドラッグアンドドロップします。

LevelManager コンポーネントを理解する

Intro

LevelManager は、ゲームが始まる前にオプションで特別な状態にすることができます。例えば、ステージのために作成されたカットシーンを表示するために使用することができます。

スターターキットには TimedLevelIntro が含まれています。TimedLevelIntro は、ゲームを開始する前に一定時間を待機する非常に簡易なゲーム導入部の時間の制御機能です。

カスタムの挙動を実装するには、Intro から拡張し、Start でロジックを実行する新しいスクリプトを作成します。例えば、タイムラインを使用して作成したカットシーンを起動するとします。導入部が完了したら、SafelyCallIntroCompleted を呼び出して、LevelManager に後を続けるように指示することができます。

Tower Library

ここで、以前作成した TowerLibrary スクリプタブルオブジェクトをステージに割り当てます。 これにより、ステージで利用可能なタワーが設定されます。

Starting Currency

Starting Currency フィールドは、プレイヤーが、開始時にタワーに使用できる所有の通貨量を決定します。

Currency Gainer

ゲームをプレイしている間にプレイヤーに継続的に通貨を供給するようにしたい場合があります。 Currency Gainer のフィールドで、これを設定することができます。

Constant Currency Gain Addition

Constant Currency Gain Addition は、毎回プレイヤーに供給される通貨量。

Constant Currency Gain Rate

Constant Currency Gain Rate は 1 秒間に通貨が供給される回数。

Home Bases

このフィールドは、プレイヤーのホームベースを定義します。敵は、この地点に達するとプレイヤーの耐久力を低下させます。PlayerHomeBase コンポーネントが設定されている最後のナビゲーションノードへの参照に、Home Bases を設定する必要があります。詳しい説明は以下を参照してください。

Environment Colliders

ここに設定されているコライダーはすべて砲弾によって簡単に無視されます。 このコライダーは、砲弾がタワーとエージェントの間の環境の小さな部分に衝突しないように、また、砲弾が敵にヒットせずに爆発しないようにするためのものです。

Pool Manager

敵、砲弾の受動的な効果のインスタンスを絶え間なく作成および破壊することは、負担のかかる操作です。 これを行う代わりに、スターターキットのプールマネージャーを利用できます。 プールマネージャーは、オブジェクトの複製を作成、格納し、再利用できるようにするクラスです。

  • 砲弾、パーティクルシステム、エージェントに Poolable コンポーネントを加えます。

  • 空のゲームオブジェクトを作成し、Pool Manager と名付けます。

  • PoolManager コンポーネントを Pool Manager ゲームオブジェクトに加えます。

  • ステージに砲弾、パーティクルシステム、敵を出現させる場合は、それらのプレハブを Poolables フィールドにドラッグアンドドラッグします。

  • 平面の Transform の Scale は必ず (1, 1, 1) に設定します。

生成された敵は PoolManage でゲームオブジェクトの子になります。つまり、それらは Transform の値を継承します。スケールを (1, 1, 1) のまま維持する場合が多いですが、すべての敵のスケールを大きくしたい場合に変更できます。

関連するチュートリアル