Unity项目架构图与程序基础框架设计

unity项目 架构图 unity程序基础框架_对象池

单例模式基类模块

作用:游戏中会有很多 Manager,使用 BaseManager 减少程序中对于单例模式的书写,节省时间

unity项目 架构图 unity程序基础框架_unity项目 架构图_02

登录后复制


public class BaseManager<T> where T : new()  //创建泛型类型,指定 T 必须为带有空参构造函数的类型
{
    private static T m_Instance;
    public static T GetInstance()
    {
        if (m_Instance == null)
        {
            m_Instance = new T();
        }
        return m_Instance;
    }
}

之后如果有需要用单例模式的类,只需要继承此类就可以

缓存池模块

unity项目 架构图 unity程序基础框架_对象池_03

unity项目 架构图 unity程序基础框架_unity项目 架构图_04


在游戏进行的时候,我们写的代码可能会实例化 (Instantiate) 很多对象,这时,程序就会在内存中不停的分配内存,一般,我们会在对象使用完之后,对它进行 Destory() 操作,比如子弹,特效,但是这个 Destory() 操作,并不是真的把对象在内存中的分配回收掉,只是把对象在场景中删除了,它只是将对象与内存空间之间的引用删除了,意思就是,此对象在内存中分配的资源依然被占用着。C#中有垃圾回收机制 GC ,这个GC在什么时候调用呢,它会等到内存一直被分配满,直到没有内存空间的时候,才会进行垃圾回收,这个时候,GC 就会进行大量的计算,分辨哪个对象没有被引用,再进行回收释放操作,这样出现的问题就是,性能会被很大的消耗,设备不好的情况下,容易出现卡顿,延迟,如果GC的回收次数比较频繁,则出现卡顿的情况会增多,用户的体验感就会下降所以,我们需要缓存池模块,缓存池模块可以有效的减缓GC的调用频率

unity项目 架构图 unity程序基础框架_unity项目 架构图_05

拿衣柜举例子,我们需要衣服的时候,就从里面去,不需要的时候就放进去

登录后复制

/// <summary>
/// 容器类,将poolmanager的List替换掉
/// </summary>
public class PoolData
{
    public GameObject m_FatherObj; //用于放置在Pool下的抽屉
    public List<GameObject> m_PoolList; 
  /// <summary>
  /// 初始化容器
  /// </summary>
  /// <param name="obj"></param>
  /// <param name="pool"></param>
    public PoolData(GameObject obj,GameObject poolObj)
    {
        //给我们的抽屉创建一个父对象,并且作为Pool(衣柜)的子对象
        m_FatherObj = new GameObject(obj.name); //新建一个 fatherobj对象
        m_FatherObj.transform.SetParent(poolObj.transform); //将此父节点设置为Pool的对象
        m_PoolList = new List<GameObject>();
        PushObject(obj);
    }
    /// <summary>
    /// 往抽屉里面放东西
    /// </summary>
    /// <param name="obj"></param>
    public void PushObject(GameObject obj)
    {
        //存东西
        m_PoolList.Add(obj);
        //让其隐藏
        obj.SetActive(false);
        //设置父对象
        obj.transform.SetParent(m_FatherObj.transform);
    }
    /// <summary>
    /// 从抽屉取东西
    /// </summary>
    public GameObject GetObject()
    {
        GameObject obj = null;
        //取出第一个
        obj = m_PoolList[0];
        m_PoolList.RemoveAt(0);
        //激活
        obj.SetActive(true);
        //断开父子关系
        obj.transform.parent = null;
        return obj;
    }
}
/// <summary>
/// 缓存池模块
/// </summary>
public class PoolManager : BaseManager<PoolManager>
{
    //创建对象池
    public Dictionary<string, PoolData> m_PoolDic = new Dictionary<string, PoolData>();
    private GameObject m_PoolObj; //场景面板里存放所有对象池对象的根对象
    /// <summary>
    /// 从对象池当中获取对象
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public GameObject GetObject(string name)
    {
        GameObject obj = null;
        //如果对象池当中,有池子,并且池子中物品的数量大于0
        if (m_PoolDic.ContainsKey(name) && m_PoolDic[name].m_PoolList.Count > 0)
        {
            obj = m_PoolDic[name].GetObject();
            
        }
        else   //对象池里没有这个对象
        {
            obj = GameObject.Instantiate(Resources.Load<GameObject>(name)); //创建这个对象
            obj.name = name; //将对象的名称改为路径名称
        }
        return obj;
    }
    /// <summary>
    /// 将对象放回对象池
    /// </summary>
    /// <param name="name"></param>
    /// <param name="obj"></param>
    public void PushObject(string name, GameObject obj)
    {
        if (m_PoolObj == null)
            m_PoolObj = new GameObject("Pool");

        //对象池里有这个池子
        if (m_PoolDic.ContainsKey(name))
        {
            m_PoolDic[name].PushObject(obj);  //放入池子
        }
        else  //没有池子
        {
            m_PoolDic.Add(name, new PoolData(obj,m_PoolObj)); //创建一个新池子,将对象放入
        }
    }
    /// <summary>
    /// 在切换场景的时候使用
    /// 清空当前场景里的对象和对象池
    /// </summary>
    public void Clean()
    {
        m_PoolDic.Clear();
        m_PoolObj = null;
    }
}

事件中心模块

unity项目 架构图 unity程序基础框架_unity项目 架构图_06

unity项目 架构图 unity程序基础框架_unity项目 架构图_07

               

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空