Tower Defense Toolkit 学习
代码太多,就不贴了.用到的基本已注释.
游戏中的数据存放在Resources/Database中.游戏运行时,通过Resources.Load加载
UI构成
对象池
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 namespace VoidGame { 6 7 /// <summary> 8 /// 对象池管理类 9 /// </summary> 10 public class ObjectPoolManager : MonoBehaviour { 11 /// <summary> 12 /// ObjectPoolManager单例 13 /// </summary> 14 public static ObjectPoolManager m_instance; 15 /// <summary> 16 /// 对象池列表 17 /// </summary> 18 public List<ObjectPool> m_objectPoolList = new List<ObjectPool>(); 19 20 21 private void Awake() { 22 m_instance = this; 23 } 24 25 /// <summary> 26 /// 获取对象池管理类所属游戏物体的transform 27 /// </summary> 28 /// <returns>transform</returns> 29 public Transform GetTransform() { 30 return transform; 31 } 32 33 /// <summary> 34 /// 孵化 35 /// </summary> 36 /// <param name="prefabGo">预设游戏物体</param> 37 /// <param name="position">位置</param> 38 /// <param name="rotation">旋转</param> 39 /// <returns>游戏物体</returns> 40 public GameObject Spawn(GameObject prefabGo,Vector3 position,Quaternion rotation) { 41 if(prefabGo == null) { 42 Debug.Log("NullReferenceException."); 43 return null; 44 } 45 //查找是否已经有使用此预设的对象池 46 int index = GetObjectPoolIndex(prefabGo); 47 48 //没找到,新建 49 if(index == -1) { 50 index = New(prefabGo); 51 } 52 53 //返回 54 return m_objectPoolList[index].Spawn(position,rotation); 55 } 56 57 /// <summary> 58 /// 回收 59 /// </summary> 60 /// <param name="go">要回收的游戏对象</param> 61 public void Unspawn(GameObject go) { 62 //遍历所有对象池,回收此对象 63 for(int i = 0;i < m_objectPoolList.Count;i++) { 64 if(m_objectPoolList[i].Unspawn(go)) { 65 return; 66 } 67 } 68 //没有在对象池中找到此对象,直接删除 69 Destroy(go); 70 } 71 72 /// <summary> 73 /// 新建游戏对象 74 /// </summary> 75 /// <param name="prefabGo">游戏对象预设</param> 76 /// <param name="count">数量</param> 77 /// <returns>返回此对象所在的对象池列表索引</returns> 78 public int New(GameObject prefabGo,int count = 2) { 79 //新建对象池 80 ObjectPool pool = new ObjectPool(); 81 //设置对象池的预设对象为此对象 82 pool.m_prefabGo = prefabGo; 83 84 pool.MatchObjectCount(count); 85 //添加此对象池到对象池列表 86 m_objectPoolList.Add(pool); 87 int index = m_objectPoolList.Count - 1; 88 return index; 89 } 90 91 /// <summary> 92 /// 获取游戏物体所在对象池的位置.没有找到返回-1 93 /// </summary> 94 /// <param name="prefabGo">预设游戏物体</param> 95 /// <returns>返回游戏预设所在的对象池索引,没找到返回-1</returns> 96 private int GetObjectPoolIndex(GameObject prefabGo) { 97 for(int i = 0;i < m_objectPoolList.Count;i++) { 98 if(m_objectPoolList[i].m_prefabGo == prefabGo) { 99 return i; 100 } 101 } 102 return -1; 103 } 104 105 /// <summary> 106 /// 清空 107 /// </summary> 108 public void Clear() { 109 for(int i = 0;i < m_instance.m_objectPoolList.Count;i++) { 110 m_objectPoolList[i].Clear(); 111 } 112 m_objectPoolList = new List<ObjectPool>(); 113 } 114 } 115 116 /// <summary> 117 /// 对象池类 118 /// </summary> 119 [System.Serializable] 120 public class ObjectPool { 121 /// <summary> 122 /// 这个对象池使用的预设 123 /// </summary> 124 public GameObject m_prefabGo; 125 126 /// <summary> 127 /// 活动游戏物体列表 128 /// </summary> 129 public List<GameObject> m_activeGoList = new List<GameObject>(); 130 /// <summary> 131 /// 非活动游戏物体列表 132 /// </summary> 133 public List<GameObject> m_inactiveGoList = new List<GameObject>(); 134 135 /// <summary> 136 /// 上限 137 /// </summary> 138 public int m_cap = 1000; 139 140 /// <summary> 141 /// 孵化 142 /// </summary> 143 /// <param name="position">位置</param> 144 /// <param name="rotation">旋转</param> 145 /// <returns></returns> 146 public GameObject Spawn(Vector3 position,Quaternion rotation) { 147 GameObject go = null; 148 //如果非活动物体列表的数量为0创建一个新的物体 149 if(m_inactiveGoList.Count == 0) { 150 go = (GameObject)Object.Instantiate(m_prefabGo,position,rotation); 151 } else { 152 //保存非活动物体列表中第一个对象的引用 153 go = m_inactiveGoList[0]; 154 go.transform.parent = null; 155 go.transform.position = position; 156 go.transform.rotation = rotation; 157 go.SetActive(true); 158 //移除非活动物体列表的第一个元素 159 m_inactiveGoList.RemoveAt(0); 160 } 161 //将物体添加到活动物体列表 162 m_activeGoList.Add(go); 163 return go; 164 } 165 166 /// <summary> 167 /// 回收 168 /// </summary> 169 /// <param name="go">要回收的游戏物体</param> 170 /// <returns></returns> 171 public bool Unspawn(GameObject go) { 172 //如果活动游戏物体列表包含要回收的游戏对象 173 if(m_activeGoList.Contains(go)) { 174 go.SetActive(false); 175 //设置物体的父物体为游戏管理物体 176 go.transform.parent = ObjectPoolManager.m_instance.GetTransform(); 177 //从活动物体列表中移除这个物体 178 m_activeGoList.Remove(go); 179 //将这个对象添加到非活动物体列表 180 m_inactiveGoList.Add(go); 181 return true; 182 } 183 return false; 184 } 185 186 /// <summary> 187 /// 匹配对象池的数量,即填充(count - currentcount)个对象池中非活动物体列表 188 /// </summary> 189 /// <param name="count">非活动游戏物体的对象</param> 190 public void MatchObjectCount(int count) { 191 //数量大于上限返回 192 if(count > m_cap) { 193 return; 194 } 195 //获取对象池内当前游戏对象的总量 196 int currentCount = GetTotalObjectCount(); 197 for(int i = currentCount;i < count;i++) { 198 //实例化对象 199 GameObject go = Object.Instantiate(m_prefabGo); 200 go.SetActive(false); 201 //设置父对象 202 go.transform.parent = ObjectPoolManager.m_instance.GetTransform(); 203 //将对象添加到非活动物体列表 204 m_inactiveGoList.Add(go); 205 } 206 } 207 208 /// <summary> 209 /// 获取所有的游戏物体数量 210 /// </summary> 211 /// <returns>游戏物体数量</returns> 212 public int GetTotalObjectCount() { 213 //非活动列表的对象总数+活动列表中的对象总数 214 return m_inactiveGoList.Count + m_activeGoList.Count; 215 } 216 217 /// <summary> 218 /// 清空所有的游戏对象 219 /// </summary> 220 public void Clear() { 221 //销毁非活动物体列表中的对象 222 for(int i = 0;i < m_inactiveGoList.Count;i++) { 223 if(m_inactiveGoList[i] != null) { 224 Object.Destroy(m_inactiveGoList[i]); 225 } 226 } 227 //销毁活动物体列表中的对象 228 for(int i = 0;i < m_activeGoList.Count;i++) { 229 if(m_activeGoList[i] != null) { 230 Object.Destroy(m_inactiveGoList[i]); 231 } 232 } 233 } 234 }
游戏中的单位:
资源管理:
能力系统:玩家在游戏界面点击能力按钮,选择目标然后释放
建造管理:当玩家点击一个平台时,显示可以建造的塔按钮列表,点击其中一个塔按钮开始建造.
孵化管理:
路径:
游戏视频:https://pan.baidu.com/s/1gfkhnRd
游戏项目:https://pan.baidu.com/s/1mhQujws