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     }
View Code

游戏中的单位:

资源管理

能力系统:玩家在游戏界面点击能力按钮,选择目标然后释放

建造管理:当玩家点击一个平台时,显示可以建造的塔按钮列表,点击其中一个塔按钮开始建造.

孵化管理:

路径:

游戏视频:https://pan.baidu.com/s/1gfkhnRd

游戏项目:https://pan.baidu.com/s/1mhQujws

原文地址:https://www.cnblogs.com/revoid/p/6376461.html