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

游戏中的数据存放在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. node(3)Buffer缓冲区

    buffer 专门用来存放二进制数据的缓冲区:处理文件流 TCP流 const buf = Buffer.from('runoob', 'ascii'); // 创建一个长度为 10.且用 0x1 填 ...

  2. 8.2 C++标准输出流对象

    参考:http://www.weixueyuan.net/view/6408.html 总结: iostream头文件,包含了该头文件后,我们就可以直接使用这些对象,包含标准的输出流对象cout.ce ...

  3. 查看linux 内核版本信息

    uname -r2.6.32-696.el6.x86_64uname -ix86_64

  4. xilinx 高速收发器Serdes深入研究-Comma码(转)

    一.为什么要用Serdes 传统的源同步传输,时钟和数据分离.在速率比较低时(<1000M),没有问题. 在速率越来越高时,这样会有问题 由于传输线的时延不一致和抖动存在,接收端不能正确的采样数 ...

  5. JS日期工具类(转)

    javascript Date format(js日期格式化) https://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.htm ...

  6. Ubuntu 修改 /etc/resolv.conf 被清空 或重启不生效解决

    sudo gedit /etc/NetworkManager/NetworkManager.conf 注释掉 dns=dnsmasq [main] plugins=ifupdown,keyfile,o ...

  7. LSTM-自然语言建模

    说到自然语言,我就会想到朴素贝叶斯,贝叶斯核心就是条件概率,而且大多数自然语言处理的思想也就是条件概率. 所以我用预测一个句子出现的概率为例,阐述一下自然语言处理的思想. 处理思想-概率 句子,就是单 ...

  8. nodejs .http模块, cheerio模块 实现 小爬虫.

    代码: var http = require("http"); var cheerio = require("cheerio"); var url = 'htt ...

  9. css设置div高度与宽度相等的一种方法

    div.category{ width:33%; padding:33% 0 0; } 1.关键在padding:33% 0 0这句代码,通过设置padding-top与宽度相等(padding使用百 ...

  10. HDU 6124 17多校7 Euler theorem(简单思维题)

    Problem Description HazelFan is given two positive integers a,b, and he wants to calculate amodb. Bu ...