代码太多,就不贴了.用到的基本已注释.

游戏中的数据存放在Resources/Database中.游戏运行时,通过Resources.Load加载

UI构成

 

对象池

 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;

 namespace VoidGame {

     /// <summary>
     /// 对象池管理类
     /// </summary>
     public class ObjectPoolManager : MonoBehaviour {
         /// <summary>
         /// ObjectPoolManager单例
         /// </summary>
         public static ObjectPoolManager m_instance;
         /// <summary>
         /// 对象池列表
         /// </summary>
         public List<ObjectPool> m_objectPoolList = new List<ObjectPool>();

         private void Awake() {
             m_instance = this;
         }

         /// <summary>
         /// 获取对象池管理类所属游戏物体的transform
         /// </summary>
         /// <returns>transform</returns>
         public Transform GetTransform() {
             return transform;
         }

         /// <summary>
         /// 孵化
         /// </summary>
         /// <param name="prefabGo">预设游戏物体</param>
         /// <param name="position">位置</param>
         /// <param name="rotation">旋转</param>
         /// <returns>游戏物体</returns>
         public GameObject Spawn(GameObject prefabGo,Vector3 position,Quaternion rotation) {
             if(prefabGo == null) {
                 Debug.Log("NullReferenceException.");
                 return null;
             }
             //查找是否已经有使用此预设的对象池
             int index = GetObjectPoolIndex(prefabGo);

             //没找到,新建
             ) {
                 index = New(prefabGo);
             }

             //返回
             return m_objectPoolList[index].Spawn(position,rotation);
         }

         /// <summary>
         /// 回收
         /// </summary>
         /// <param name="go">要回收的游戏对象</param>
         public void Unspawn(GameObject go) {
             //遍历所有对象池,回收此对象
             ;i < m_objectPoolList.Count;i++) {
                 if(m_objectPoolList[i].Unspawn(go)) {
                     return;
                 }
             }
             //没有在对象池中找到此对象,直接删除
             Destroy(go);
         }

         /// <summary>
         /// 新建游戏对象
         /// </summary>
         /// <param name="prefabGo">游戏对象预设</param>
         /// <param name="count">数量</param>
         /// <returns>返回此对象所在的对象池列表索引</returns>
         ) {
             //新建对象池
             ObjectPool pool = new ObjectPool();
             //设置对象池的预设对象为此对象
             pool.m_prefabGo = prefabGo;

             pool.MatchObjectCount(count);
             //添加此对象池到对象池列表
             m_objectPoolList.Add(pool);
             ;
             return index;
         }

         /// <summary>
         /// 获取游戏物体所在对象池的位置.没有找到返回-1
         /// </summary>
         /// <param name="prefabGo">预设游戏物体</param>
         /// <returns>返回游戏预设所在的对象池索引,没找到返回-1</returns>
         private int GetObjectPoolIndex(GameObject prefabGo) {
             ;i < m_objectPoolList.Count;i++) {
                 if(m_objectPoolList[i].m_prefabGo == prefabGo) {
                     return i;
                 }
             }
             ;
         }

         /// <summary>
         /// 清空
         /// </summary>
         public void Clear() {
             ;i < m_instance.m_objectPoolList.Count;i++) {
                 m_objectPoolList[i].Clear();
             }
             m_objectPoolList = new List<ObjectPool>();
         }
     }

     /// <summary>
     /// 对象池类
     /// </summary>
     [System.Serializable]
     public class ObjectPool {
         /// <summary>
         /// 这个对象池使用的预设
         /// </summary>
         public GameObject m_prefabGo;

         /// <summary>
         /// 活动游戏物体列表
         /// </summary>
         public List<GameObject> m_activeGoList = new List<GameObject>();
         /// <summary>
         /// 非活动游戏物体列表
         /// </summary>
         public List<GameObject> m_inactiveGoList = new List<GameObject>();

         /// <summary>
         /// 上限
         /// </summary>
         ;

         /// <summary>
         /// 孵化
         /// </summary>
         /// <param name="position">位置</param>
         /// <param name="rotation">旋转</param>
         /// <returns></returns>
         public GameObject Spawn(Vector3 position,Quaternion rotation) {
             GameObject go = null;
             //如果非活动物体列表的数量为0创建一个新的物体
             ) {
                 go = (GameObject)Object.Instantiate(m_prefabGo,position,rotation);
             } else {
                 //保存非活动物体列表中第一个对象的引用
                 go = m_inactiveGoList[];
                 go.transform.parent = null;
                 go.transform.position = position;
                 go.transform.rotation = rotation;
                 go.SetActive(true);
                 //移除非活动物体列表的第一个元素
                 m_inactiveGoList.RemoveAt();
             }
             //将物体添加到活动物体列表
             m_activeGoList.Add(go);
             return go;
         }

         /// <summary>
         /// 回收
         /// </summary>
         /// <param name="go">要回收的游戏物体</param>
         /// <returns></returns>
         public bool Unspawn(GameObject go) {
             //如果活动游戏物体列表包含要回收的游戏对象
             if(m_activeGoList.Contains(go)) {
                 go.SetActive(false);
                 //设置物体的父物体为游戏管理物体
                 go.transform.parent = ObjectPoolManager.m_instance.GetTransform();
                 //从活动物体列表中移除这个物体
                 m_activeGoList.Remove(go);
                 //将这个对象添加到非活动物体列表
                 m_inactiveGoList.Add(go);
                 return true;
             }
             return false;
         }

         /// <summary>
         /// 匹配对象池的数量,即填充(count - currentcount)个对象池中非活动物体列表
         /// </summary>
         /// <param name="count">非活动游戏物体的对象</param>
         public void MatchObjectCount(int count) {
             //数量大于上限返回
             if(count > m_cap) {
                 return;
             }
             //获取对象池内当前游戏对象的总量
             int currentCount = GetTotalObjectCount();
             for(int i = currentCount;i < count;i++) {
                 //实例化对象
                 GameObject go = Object.Instantiate(m_prefabGo);
                 go.SetActive(false);
                 //设置父对象
                 go.transform.parent = ObjectPoolManager.m_instance.GetTransform();
                 //将对象添加到非活动物体列表
                 m_inactiveGoList.Add(go);
             }
         }

         /// <summary>
         /// 获取所有的游戏物体数量
         /// </summary>
         /// <returns>游戏物体数量</returns>
         public int GetTotalObjectCount() {
             //非活动列表的对象总数+活动列表中的对象总数
             return m_inactiveGoList.Count + m_activeGoList.Count;
         }

         /// <summary>
         /// 清空所有的游戏对象
         /// </summary>
         public void Clear() {
             //销毁非活动物体列表中的对象
             ;i < m_inactiveGoList.Count;i++) {
                 if(m_inactiveGoList[i] != null) {
                     Object.Destroy(m_inactiveGoList[i]);
                 }
             }
             //销毁活动物体列表中的对象
             ;i < m_activeGoList.Count;i++) {
                 if(m_activeGoList[i] != null) {
                     Object.Destroy(m_inactiveGoList[i]);
                 }
             }
         }
     }

游戏中的单位:

资源管理:

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

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

孵化管理:

路径:

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

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

Tower Defense Toolkit 学习的更多相关文章

  1. 初识Tower Defense Toolkit

    Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...

  2. dp --- hdu 4939 : Stupid Tower Defense

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  3. hdu4939 Stupid Tower Defense (DP)

    2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131 ...

  4. Stupid Tower Defense

    Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...

  5. HDU4939Stupid Tower Defense (有思想的dp)

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...

  6. Tower Defense Game

    Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...

  7. hdu 4779 Tower Defense (思维+组合数学)

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) ...

  8. HDU 4779:Tower Defense

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

  9. Window ferformance toolkit 学习

    1.环境配置 2.内存泄露 a. 编写自己的wprp文件: http://msdn.microsoft.com/en-us/library/hh448223.aspx b.启动 @echo off s ...

随机推荐

  1. windows剪贴板

    0x01  Windows剪贴板 Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制.Windows系统支持剪贴板IP ...

  2. 传统应用迁移到kubernetes(Hadoop YARN)

    spark-on-yarn-with-kubernetes 该例子仅用来说明具体的步骤划分和复杂性,在生产环境应用还有待验证,请谨慎使用. 过程中可能用到的概念和术语初步整理如下: 整个迁移过程分为如 ...

  3. DevExpress WinForms v18.2新版亮点(一)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...

  4. 201621123001 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 一个进程可以同时运行多个不同线程,不同的线程执行不同的任务 Java线程是通过java.lang包中定义的Thre ...

  5. python第一个程序HelloWorld

    在写第一个python程序之前,我们还需要了解的一个东西就是python解释器 解释器,顾名思义,就是解释一段代码的机器,程序运行的平台,例如Java的解释器就是jdk. 我们在写好的python代码 ...

  6. NioEventLoopGroup的构造函数

    loop是对thread的封装,里面记录一个selector 一套打完,看下来,就是loopgroup里面一个loop的数组,每一个loop在 new的时候,传入了selector(第二个箭头), 第 ...

  7. 实力封装:Unity打包AssetBundle(四)

    →→前情提要:窗口初现←← 让用户选择要打包的文件 时至今日,我们选择打包文件的方式依然是在Project面板或Hierarchy面板中用鼠标点选.现在既然有了窗口,我们自然希望可以将所有文件罗列在窗 ...

  8. shell脚本实例-nginx日志分析

    统计2018/8/6 PV量 grep "06/Aug/2018" access.log|wc -l 统计当天8:00 到9:00的PV awk '$4>="[06 ...

  9. audit:backlog limit exceeded

    今天发现存储服务器业务不可用,服务器能ping通,远程不了!  到机房管理员那里查看服务器状态后,发现显示如下: 显然系统已经崩溃,只能先重启服务器,先恢复业务,然后针对backlog limit e ...

  10. anaconda jupyter notebook修改默认文件路径

    使用anaconda附带的jupyter,想要改变默认运行文件路径,直接在cmd中输入jupyter notebook会提示:jupyter不是内部命令! 可能是anaconda代理了他所安装的软件, ...