zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Codeforces Round #649 (Div. 2) A、B、C、
    poj1061 青蛙的约会(扩展欧几里得)
    Educational Codeforces Round 89 (Rated for Div. 2)A、B、C、D、E
    jxust摸底测试1
    Codeforces Round #648 (Div. 2) A、B、C、D、E、F
    大数模板
    任意进制转换(2019 ICPC Asia Yinchuan Regional Base62)
    求素数(从判断素数到筛法)
    直线 (__int128的使用)
    E. Tree Shuffling (Round #646 (Div. 2))
  • 原文地址:https://www.cnblogs.com/revoid/p/6376461.html
Copyright © 2011-2022 走看看