Unity チュートリアルのタワーディフェンステンプレートを触ってみる(31)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(30)では Tower ゲームオブジェクトに追加した、CurrencyAffector の解説を行った。これで「その他の効果、ビジュアライザー、挙動編」は一通り完了したことになる。今回から「タワーディフェンステンプレートのステージの設定編」を進めていく。
1.タワーディフェンステンプレートのステージの設定編 – 概要
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(2)で述べた通り、Unity のチュートリアルに沿って作業を進めていく。ということで次にタワーディフェンステンプレートのステージの設定について進めていく。
Unity 公式ページの「タワーディフェンステンプレートのステージの設定」についてはこちらを参照してほしい。
『さまざまな効果を持つタワーや敵エージェントを作成したので、次に、プレイヤーが敵から陣地を守るためにタワーを建てられるステージを設定します。』
2.タワーディフェンステンプレートのステージの設定編 – プロトタイプレベル
『ゲームを作成するときに、プレースホルダーのアートアセットを作成して早期にデザイン作業をテストすることには十分な価値があります。これにより、設計を変更する必要が生じた場合にアートの変更に時間や労力を費やす以前に、システムとレベルの設計が意図どおりに機能するかを確認しておくことができます。
開発プロセスのこの段階を示すために、スターターキットにはステージ 1 のプロトタイプバージョンが含まれています。プロトタイプステージはステージ 1 とほぼ同じです。ただし、環境アートはゲームで再生する最終バージョンよりも遥かに単純です。 最終段階の複雑なゲーム世界のジオメトリの代わりに、プロトタイプはすべて Unity エディターで利用可能な 3D プリミティブで構成されています。
プロトタイプから最終段階に進むとき、リリース品質を作るために以下の技術的な点が考慮されました。
メッシュの拡張
ステージモデルは拡張され、プレイヤーがプレイエリアの境界の外に決して出ないようにしました。
ステージのメッシュ結合
ステージのメッシュは、大きすぎないように細かく分割しました。 カメラの錐台よりもはるかに大きいメッシュは効率的ではありません。なぜなら、多くの頂点が画面外に描画されるからです。小数のメッシュの集合でステージを維持してドローコールや錐台のカリングのコストを最小限に抑えつつ、メッシュが大きくなりすぎるのを回避することが大切だからです。
コリジョンメッシュ
近似コリジョンメッシュを作成しました。 これにより、弾丸がステージのオブジェクトにヒットします。また、タワーを配置するときにカーソルをステージ上に表示するためのものです。
表示されない面の削除
表示されない面はゲーム世界のオブジェクトから削除しました。 大抵の場合、これにはオブジェクトの一番下にある面が含まれます。 これらの面を削除すると、特に低性能デバイスでパフォーマンスを低下させるオーバードローを削減できます。
プロトタイプのアートアセットから最終的な高品質のアセットに移行する場合は、上記を考慮する必要があります。上記を行うことによって、パフォーマンスが良く、管理しやすいステージになります。 これらのステップを経て作成されたステージには、正しく動作するために必要なすべてのオブジェクトとコンポーネントが含まれているはずです。
このチュートリアルの残りの部分では、空の Unity のシーンからステージを段階的に作成することに焦点を当てており、高品質のアートアセットを作成する手順はあまり含まれていません。』
云々と記載があるがタワーディフェンステンプレートのプロトタイプの素晴らしさについて、プロトタイプに対して行ったことを記載している。重要なことはコレ以降の内容となる。
3.タワーディフェンステンプレートのステージの設定編 – レベルリスト
『メニューシステムを通じてプレイヤーがステージにアクセスできるようにするには、レベルリストを作成してステージを加えます。これを行うには、以下の手順で行います。』とのことなので指示に従ってレベルリストの作成を進める。手順については以下の通りとなっている。
-
Project ウィンドウから Create > Starter Kit > Level List を選択します。
-
LevelList スクリプタブルオブジェクトにステージの詳細を加えます。
上記の手順に従いまずは Level List の作成を行っていく指示に記載されている東リ Create > Starter Kit > Level List から Level List の作成を行う。
その後、LevelList スクリプタブルオブジェクトにステージの詳細を加えていく。内容としては以下の通り。
- ID : メニューに表示されるステージの順番。
- Name : ステージのタイトル。
- Description : プレイヤーにステージの特徴を説明する短い文。
- Scene Name : ステージを含むシーンの名前。
『ステージがゲームの Level Select メニューに表示されます。 (訳注:Tower Defense Template パッケージをインポートすると、設定済みの LevelList スクリプタブルオブジェクトのアセットがインポートされます。Project ビューで「LevelList」を検索すると見つかります。詳しい設定についてはこちらのアセットも参考にしてください)』これを作成するとメニューに自動的に選択されるらしい。
4.タワーディフェンステンプレートのステージの設定編 – ジオメトリの設定
『すでにより複雑なメッシュを作成している場合は、この手順を飛ばして代わりにそれを使用できます。』とのことだが、指示に従ってジオメトリの設定を行っていきたいと思う。手順については以下の通りとなっている。
-
以前作成した空のシーンに大きな平面を加えます。Hierarchy ウィンドウから Create > 3D Object > Plane を選択します。
-
Plane の Transform の Position は必ず (0, 0, 0) に設定します。
-
3D オブジェクトをステージに加え、レイアウトを作成します。キューブとシリンダーが最も適切です。Hierarchy ウィンドウから Create > 3D Object > Cube/Cylinder を選択します。
上記の手順に従いまずは Plane の作成を行っていく指示に記載されている通り Create > 3D Object > Plane から Plane の作成を行う。
その後、Transform の Position を (0, 0, 0) に設定し、フィールドを作成していく。
そして、指示通り適当にオブジェクトを設置してマップの作成を進める。
5.タワーディフェンステンプレートのステージの設定編 – NavMesh の設定
『ステージジオメトリを移動可能にするためには、NavMesh をベイクする必要があります。』とのことなので、指示に従って NavMesh の設定を行っていきたいと思う。手順については以下の通りとなっている。
-
Planeかステージメッシュを選択します。
-
Navigation ウィンドウの Object タブを開きます
-
Navigation の Static オプションにチェックを入れます
-
Navigation Area を Walkable に設定します。
-
エージェントが通り抜けすべきでない 3D オブジェクトを選択します。
-
Navigation ウィンドウの Object タブを開きます
-
Navigation の Static オプションにチェックを入れます
-
Navigation Area を Non-Walkable に設定します。
上記の手順に従い作業を進めていくために Navigation ウィンドウの表示を行う必要がある。Navigation ウィンドウは ウィンドウ > AI > ナビゲーション から表示させることができる
その後、4.で作成した Plane を選択肢上記の指示通り Object タブを表示し、Navigation の Static オプションにチェックを入れ、Navigation Area を Walkable に設定すると以下の通りとなる。
同様に、エージェントが通り抜けすべきでない 3D オブジェクトを選択し、Navigation の Static オプションにチェックを入れ、Navigation Area を Non Walkable に設定すると以下の通りとなる。
上記の手順がすべて完了後、Plane を選択して Navigation ウィンドウを Bake タブを表示する。Bake タブの下部にある Bake ボタンをクリックして Baking を行う。すると以下の画像のようにエージェントの通り抜けが可能な領域がメッシュ状に表示されるようになる。
6.タワーディフェンステンプレートのステージの設定編 – ナビゲーションノード
『敵をステージ上で移動させるには、点から点に移動できるようにノードを設定する必要があります。ノードはまた、エージェントが発生する地点と、エージェントが到達するとプレイヤーの本拠地がダメージを受ける地点を定義するためにも使用されます。
空のゲームオブジェクトに Node コンポーネントを追加することでノードを作成します。 これにより、エージェントが発生する地点を定義するメッシュを作成でき、エージェントがノード領域内のランダムな点を選択して移動できるようになります。ランダムな点を選択できるようになったため、エージェントが 1 箇所に固まることがなくなります。』とのことなので、指示に従ってナビゲーションノードの作成を行っていきたいと思う。手順については以下の通りとなっている。
-
空のゲームオブジェクトを作成し、Navigation Nodes か、それに似た名前を付けます。
-
空のゲームオブジェクトを作成して Navigation Nodes の子にし、StartNode と名前を付けます。
-
StartNode ゲームオブジェクトに Node コンポーネントを加えます。
-
Select/Add Mesh ボタンをクリックします。
-
子ゲームオブジェクトのメッシュを調節して適当な形状にします。
-
StartNode ゲームオブジェクトに Sphere Collider か Capsule Collider コンポーネントを加えます。
-
Is Trigger にチェックを入れます。
-
Collider にノードメッシュが含まれていることを確認します。
しかしながら、Unity 2018.3.0b5 版では
-
空のゲームオブジェクトを作成し、Navigation Nodes か、それに似た名前を付けます。
-
空のゲームオブジェクトを作成して Navigation Nodes の子にし、StartNode と名前を付けます。
-
StartNode ゲームオブジェクトに Sphere Collider か Capsule Collider コンポーネントを加えます。
-
Is Trigger にチェックを入れます。
-
StartNode ゲームオブジェクトに Node コンポーネントを加えます。
-
Select/Add Mesh ボタンをクリックします。
-
子ゲームオブジェクトのメッシュを調節して適当な形状にします。
-
Collider にノードメッシュが含まれていることを確認します。
上記の手順に従いまずは空のゲームオブジェクトを Navigation Nodes という名称で作成し、その子として空のゲームオブジェクトを Start Node という名前で作成すると以下のようになる。
その後、StartNode ゲームオブジェクトに Node コンポーネントを追加すると以下のようになり Select/Add Mesh ボタンが表示されるのでクリックする。
それを複数個作成し、FixedNodeSelector でノードを繋げていくと以下のようになる。
記載量が少々が多くなりすぎてしまったため、ここで一旦区切りたいと思う。続きについては次回以降をお待ち下さい。