Unity チュートリアルのタワーディフェンステンプレートを触ってみる(2)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(1) では Unity に記載されている導入から概要までを簡単に引用した。今回から、実際に Unity を用いてタワーディフェンステンプレートを作成していく。
1.タワー編 – 概要
Unity のチュートリアルに沿って作業を進めていく。ということでタワーについて進めていく。
『タワーディフェンスゲームのもっとも重要な要素はタワーです。タワーディフェンステンプレートには、タワーの作成に使用する 2 つの主要な要素があります。1 つめはタワーコンポーネントで、タワーの基本的な機能を定義します。2 つめはタワーレベルコンポーネントで、アップグレードしたときのタワーの挙動を定義します。』
とのことなので、上記について理解を進めていく。
2.タワー編 – プロジェクトの作成する
プロジェクトの作成については以前に記事にまとめているのでこちらを参照してほしい。ただし、以前は2Dで作成していたが今回は3Dでの作成となる。また、今回作成するチュートリアル用プロジェクト名は「TowerDefenseTutorial」としておく。
3.タワー編 – アセットをインポートする
Unity でプロジェクトを作成後、アセットストアに「Tower Defense Template」と入力し、UNITY TECHNOLOGIES の「Tower Defense Template」をダウンロード~インポートまでを行う。
「Tower Defense Template」と入力しダウンロードページを表示すると以下のような画面となるはずだ。
実際にインポートを行うと以下のようなデータ郡がインポートされるので、全てが選択されていることを確認しインポートボタンをクリックする。
※ 注意
Unity 2018.3.0b5 版では「Asset/Editor/PropertyDrawers/MinDrawer」に
Assets/PostProcessing/Editor/PropertyDrawers/MinDrawer.cs(6,34): error CS0104: `MinAttribute' is an ambiguous reference between `UnityEngine.MinAttribute' and `UnityEngine.PostProcessing.MinAttribute'
というエラーが発生した。これを解消するためにスクリプトの先頭に
using MinAttribute = UnityEngine.PostProcessing.MinAttribute;
の一行を追加した。
4.タワー編 – タワー設定データを作成する
『タワーゲームオブジェクト自体を作成する前に、さまざまなレベルでどのように挙動するかについてのデータを格納するデータオブジェクトを作成する必要があります。このオブジェクトは TowerLevelData スクリプタブルオブジェクトと呼ばれます。』
とのことなので指示通り「TowerLevelData スクリプタブルオブジェクト」を作成していく。チュートリアルの手順では以下の通りとなっている。
- Project ウィンドウの右上にある Create メニューをクリックし、Create > Tower Defense > Tower Configuration を選択します。
- スクリプタブルオブジェクトに、そのタイプとレベル数に関連した名前を付けます (例えば Laser1)。
- この ScriptableObject を Data/Towers に配置します。
- タワーの名前、耐久力、コストに関する値を設定します。
しかしながら、Unity 2018.3.0b5 版では
- Project ウィンドウの左上にある Create メニューをクリックし、Create > Tower Defense > Tower Configuration を選択します。
- スクリプタブルオブジェクトに、そのタイプとレベル数に関連した名前を付けます (例えば Laser1)。
- この ScriptableObject を Data/Towers に配置します。
- タワーの名前、耐久力、コストに関する値を設定します。
今回はタワーディフェンステンプレートではすでに作成済みのデータがあるのでそれを流用していく。
稚拙ながら少々解説
「Tower Configuration」は 「Assets/Scripts/TowerDefense/Towers/Data/TowerLevelData.cs」ファイルをもとに生成している。内容としては Tower の設定情報を保持するだけの簡単なクラス構成となっている。
[cce_csharp]using UnityEngine; namespace TowerDefense.Towers.Data { /// < summary> /// Data container for settings per tower level /// < /summary> [CreateAssetMenu(fileName = "TowerData.asset", menuName = "TowerDefense/Tower Configuration", order = 1)] public class TowerLevelData : ScriptableObject { /// < summary> /// A description of the tower for displaying on the UI /// < /summary> public string description; /// < summary> /// A description of the tower for displaying on the UI /// < /summary> public string upgradeDescription; /// < summary> /// The cost to upgrade to this level /// < /summary> public int cost; /// < summary> /// The sell cost of the tower /// < /summary> public int sell; /// < summary> /// The max health /// < /summary> public int maxHealth; /// < summary> /// The starting health /// < /summary> public int startingHealth; /// < summary> /// The tower icon /// < /summary> public Sprite icon; } }[/cce_csharp]
3行目「namespace」は簡単に例えるとフォルダ構成のようなもので、「TowerDefense」フォルダの中にある「Towers」フォルダの中にある「Data」フォルダを指しているようなものだと思っていただくのがわかりやすいだろう。
8行目「[CreateAssetMenu(fileName = “TowerData.asset”, menuName = “TowerDefense/Tower Configuration”, order = 1)]」は Asset のメニューに対して、手順に記載されているメニュー(Create > Tower Defense > Tower Configuration)を追加する定型文である。
9行目「public class TowerLevelData : ScriptableObject」については別途記事をまとめているためこちらを参照してほしい。
それ以降については、保持するデータをグローバル変数として定義しているのみであるため、解説は省略させていただく。
少々記載内容が多くなりすぎてしまったため、ここで一旦区切らせていただく。続きは明日以降記載していく予定ですのでしばしお待ち下さい。