unity管理器设计:Manager of Managers

一、管理器Manager

Manager管理器是对一类对象进行统一管理,像是UIManager,AudioManager,InputManager等。

UIManager对UI的生命周期进行统一管理,AudioManager对音频的播放进行统一管理,InputManager对玩家的输入进行统一管理。

一个Manage对应管理一类对象,Manager是全局唯一的,所以通常以单例实现Manager。

二、Manager of Managers

随着功能的开发,Manager的数量不断增加,单例会逐渐变得难以管理。

为了解决单例数量太多难以管理的问题,引入一个大的单例Manger做为入口,通过这个Manager去访问其他子Manager。

全局只存在一个大的单例Manger。

三、代码实现

单例:

public abstract class Singleton<T> where T : class, new()
{
    private static T _instance;
    public abstract void Init();

    public static T Instance
    {
        get
        {
            if(_instance == null)
                _instance = new T();
            return _instance;
        }
    }
}

管理器入口GameManager:

using System;
using System.Collections.Generic;
namespace Manager
{
    /// <summary>
    /// Manager入口
    /// </summary>
    public partial class GameManager : Singleton<GameManager>
    {
        private Dictionary<Type,BaseManager> managerDic = new Dictionary<Type, BaseManager>();

        public override void Init()
        {
            OnInit();
        }
    
        public T Get<T>() where T : BaseManager, new()
        {
            Type type = typeof(T);
            if (!managerDic.ContainsKey(type))
            {
                T manager = new T();
                manager.OnInit();
                managerDic[type] = manager;
            }
            return (T)managerDic[type];
        }
    
        public void ClearManager<T>(T type) where T : BaseManager, new()
        {
            if(managerDic.ContainsKey(type as Type))
            {
                type.OnClear();
                managerDic[type as Type] = null;
                type = null;
            }
        }
    
        public void CleaerAllManagers()
        {
            foreach (var keyValuePair in managerDic)
            {
                keyValuePair.Value.OnClear();
                BaseManager manager = keyValuePair.Value;
                manager = null;
            }
            managerDic.Clear();
        }
    }
}
namespace Manager
{
    public partial class GameManager : Singleton<GameManager>
    {
        // manager初始化
        private void OnInit()
        {
            Instance.Get<InoutManager>().OnInit();
        }
    }
}

BaseManager

public abstract class BaseManager
{
    public abstract void OnInit();
    public abstract void OnClear();
}

 

posted @ 2025-10-27 16:53  apssic  阅读(25)  评论(0)    收藏  举报