Tower Defense Toolkit 学习
代码太多,就不贴了.用到的基本已注释.

游戏中的数据存放在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 学习的更多相关文章
- 初识Tower Defense Toolkit
Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...
- dp --- hdu 4939 : Stupid Tower Defense
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- Stupid Tower Defense
Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...
- HDU4939Stupid Tower Defense (有思想的dp)
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- Tower Defense Game
Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...
- hdu 4779 Tower Defense (思维+组合数学)
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- HDU 4779:Tower Defense
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)T ...
- Window ferformance toolkit 学习
1.环境配置 2.内存泄露 a. 编写自己的wprp文件: http://msdn.microsoft.com/en-us/library/hh448223.aspx b.启动 @echo off s ...
随机推荐
- windows剪贴板
0x01 Windows剪贴板 Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制.Windows系统支持剪贴板IP ...
- 传统应用迁移到kubernetes(Hadoop YARN)
spark-on-yarn-with-kubernetes 该例子仅用来说明具体的步骤划分和复杂性,在生产环境应用还有待验证,请谨慎使用. 过程中可能用到的概念和术语初步整理如下: 整个迁移过程分为如 ...
- DevExpress WinForms v18.2新版亮点(一)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...
- 201621123001 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 一个进程可以同时运行多个不同线程,不同的线程执行不同的任务 Java线程是通过java.lang包中定义的Thre ...
- python第一个程序HelloWorld
在写第一个python程序之前,我们还需要了解的一个东西就是python解释器 解释器,顾名思义,就是解释一段代码的机器,程序运行的平台,例如Java的解释器就是jdk. 我们在写好的python代码 ...
- NioEventLoopGroup的构造函数
loop是对thread的封装,里面记录一个selector 一套打完,看下来,就是loopgroup里面一个loop的数组,每一个loop在 new的时候,传入了selector(第二个箭头), 第 ...
- 实力封装:Unity打包AssetBundle(四)
→→前情提要:窗口初现←← 让用户选择要打包的文件 时至今日,我们选择打包文件的方式依然是在Project面板或Hierarchy面板中用鼠标点选.现在既然有了窗口,我们自然希望可以将所有文件罗列在窗 ...
- shell脚本实例-nginx日志分析
统计2018/8/6 PV量 grep "06/Aug/2018" access.log|wc -l 统计当天8:00 到9:00的PV awk '$4>="[06 ...
- audit:backlog limit exceeded
今天发现存储服务器业务不可用,服务器能ping通,远程不了! 到机房管理员那里查看服务器状态后,发现显示如下: 显然系统已经崩溃,只能先重启服务器,先恢复业务,然后针对backlog limit e ...
- anaconda jupyter notebook修改默认文件路径
使用anaconda附带的jupyter,想要改变默认运行文件路径,直接在cmd中输入jupyter notebook会提示:jupyter不是内部命令! 可能是anaconda代理了他所安装的软件, ...