サイトアイコン StudioFun

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(42)

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(41)では本拠地の設定に必要な PlayerHomeBase の解説を行っていく。今回はそのステージで使用できるタワーを設定するのに用いる TowerLibrary の解説を行っていく。

1.タワーディフェンステンプレートのステージの設定編 – TowerLibrary.cs

TowerLibrary.cs について稚拙ながら解説

「TowerLibrary.cs」は「Assets/Scripts/TowerDefense/Towers/Data/TowerLibrary.cs」の指しておりスクリプトについては以下の通り。内容としてはタワーのデータ管理を行っている。

[cce_csharp]using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace TowerDefense.Towers.Data
{
	/// <summary>
	/// The asset which holds the list of different towers
	/// </summary>
	[CreateAssetMenu(fileName = "TowerLibrary.asset", menuName = "TowerDefense/Tower Library", order = 1)]
	public class TowerLibrary : ScriptableObject, IList<Tower>, IDictionary<string, Tower>
	{
		/// <summary>
		/// The list of all the towers
		/// </summary>
		public List<Tower> configurations;

		/// <summary>
		/// The internal reference to the dictionary made from the list of towers
		/// with the name of tower as the key
		/// </summary>
		Dictionary<string, Tower> m_ConfigurationDictionary;

		/// <summary>
		/// The accessor to the towers by index
		/// </summary>
		/// <param name="index"></param>
		public Tower this[int index]
		{
			get { return configurations[index]; }
		}

		public void OnBeforeSerialize()
		{
		}

		/// <summary>
		/// Convert the list (m_Configurations) to a dictionary for access via name
		/// </summary>
		public void OnAfterDeserialize()
		{
			if (configurations == null)
			{
				return;
			}
			m_ConfigurationDictionary = configurations.ToDictionary(t => t.towerName);
		}

		public bool ContainsKey(string key)
		{
			return m_ConfigurationDictionary.ContainsKey(key);
		}

		public void Add(string key, Tower value)
		{
			m_ConfigurationDictionary.Add(key, value);
		}

		public bool Remove(string key)
		{
			return m_ConfigurationDictionary.Remove(key);
		}

		public bool TryGetValue(string key, out Tower value)
		{
			return m_ConfigurationDictionary.TryGetValue(key, out value);
		}

		Tower IDictionary<string, Tower>.this[string key]
		{
			get { return m_ConfigurationDictionary[key]; }
			set { m_ConfigurationDictionary[key] = value; }
		}

		public ICollection<string> Keys
		{
			get { return ((IDictionary<string, Tower>) m_ConfigurationDictionary).Keys; }
		}

		ICollection<Tower> IDictionary<string, Tower>.Values
		{
			get { return m_ConfigurationDictionary.Values; }
		}

		IEnumerator<KeyValuePair<string, Tower>> IEnumerable<KeyValuePair<string, Tower>>.GetEnumerator()
		{
			return m_ConfigurationDictionary.GetEnumerator();
		}

		public void Add(KeyValuePair<string, Tower> item)
		{
			m_ConfigurationDictionary.Add(item.Key, item.Value);
		}

		public bool Remove(KeyValuePair<string, Tower> item)
		{
			return m_ConfigurationDictionary.Remove(item.Key);
		}

		public bool Contains(KeyValuePair<string, Tower> item)
		{
			return m_ConfigurationDictionary.Contains(item);
		}

		public void CopyTo(KeyValuePair<string, Tower>[] array, int arrayIndex)
		{
			int count = array.Length;
			for (int i = arrayIndex; i < count; i++)
			{
				Tower config = configurations[i - arrayIndex];
				KeyValuePair<string, Tower> current = new KeyValuePair<string, Tower>(config.towerName, config);
				array[i] = current;
			}
		}

		public int IndexOf(Tower item)
		{
			return configurations.IndexOf(item);
		}

		public void Insert(int index, Tower item)
		{
			configurations.Insert(index, item);
		}

		public void RemoveAt(int index)
		{
			configurations.RemoveAt(index);
		}

		Tower IList<Tower>.this[int index]
		{
			get { return configurations[index]; }
			set { configurations[index] = value; }
		}

		public IEnumerator<Tower> GetEnumerator()
		{
			return configurations.GetEnumerator();
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return ((IEnumerable) configurations).GetEnumerator();
		}

		public void Add(Tower item)
		{
			configurations.Add(item);
		}

		public void Clear()
		{
			configurations.Clear();
		}

		public bool Contains(Tower item)
		{
			return configurations.Contains(item);
		}

		public void CopyTo(Tower[] array, int arrayIndex)
		{
			configurations.CopyTo(array, arrayIndex);
		}

		public bool Remove(Tower item)
		{
			return configurations.Remove(item);
		}

		public int Count
		{
			get { return configurations.Count; }
		}

		public bool IsReadOnly
		{
			get { return ((ICollection<Tower>) configurations).IsReadOnly; }
		}
	}
}[/cce_csharp]

上記の処理は、登場するタワーデータをリストとして管理している。詳細については DLL の処理を用いているため、ここでは解説を行うことができない。よってここではソースコードの提示のみとさせていただく。

モバイルバージョンを終了