//干了几年的活,一直都是看别人写博客,前两天也注册了一个账号,一直没时间写,今天周五,抽个时间也写个极简版的伪框架,希望能帮助到一些人吧
//废话不多说,直接上代码
//最开始需要写一个单例类,单例的作用我就不多说了,可能以后的博客中我会写到
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Single<T> where T : class, new()
{
public static readonly Object lockobj = new Object();
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
lock (lockobj)
{
if (instance == null)
{
instance = new T();
}
}
}
return instance;
}
}
}
//首先写一个model的数据基类,主要用于对一些Model的数据进行管理
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class ModelBase
{
virtual public void OnLoad() { }
virtual public void OnRlege() { }
}
//然后写一个Model的管理器,对于Model的数据进行一系列的管理作用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class ModelManager : Single<ModelManager>
{
Dictionary<Type, ModelBase> allModel = new Dictionary<Type, ModelBase>();
public void RegisterAll()
{
Debug.Log("所有模型初始化注册完毕");
return;
}
//数据初始化注册一下
public void Register(ModelBase model)
{
if (!allModel.ContainsValue(model))
{
allModel.Add(model.GetType(), model);
model.OnLoad();
}
}
public T GetModel<T>() where T : ModelBase
{
Type type = typeof(T);
ModelBase mb;
allModel.TryGetValue(type, out mb);
if (mb != null)
{
return (T)mb;
}
return null;
}
}
//因为主要是UI界面的东西,所以我写了一个预制加载的管理器.,以便于统一管理,而不用系统中的Resources,Load<>()方法,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ResourcesManager : Single<ResourcesManager>
{
Dictionary<string, object> resdic = new Dictionary<string, object>();
public T LoadAssest<T>(string key) where T : Object
{
//判断一下,如果不包含就直接生成添加进字典
if (!resdic.ContainsKey(key))
{
T mold = Resources.Load<T>(key);
resdic.Add(key, mold);
return mold;
}
return resdic[key] as T;
}
}
//敲敲代码,鼻子出血了,好神奇哦,等我一下…嗯,好了,然后写一个UI基类,里面我只放了三个方法,打开,关闭,和获取
//所有的UI功能脚本都要继承UIBase,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIBase : MonoBehaviour
{
//打开方法
virtual public void Open()
{
this.gameObject.SetActive(true);
}
//关闭方法
virtual public void Close()
{
this.gameObject.SetActive(false);
}
//获取脚本
virtual public GameObject GetUI()
{
return this.gameObject;
}
}
//继续写一个UI的管理器.,里面也是对UI界面内的一系列操作方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIManager : Single<UIManager>
{
//用一个字典储存,字符串做键,UIbase做值,因为,所有的UI功能脚本都要继承UIbase,
Dictionary<string, UIBase> uimdic = new Dictionary<string, UIBase>();
//路径,全局找一下路径,生成的所有UI界面都要在Canvas下面
Transform path;
public UIManager()
{
//路径,全局找一下路径
path = GameObject.Find("Canvas").transform;
}
public void Open(string key)
{
//判断一下,如果不包含就添加进去,如果包含那就直接打开咯
if (!uimdic.ContainsKey(key))
{
GameObject pfb = ResourcesManager.Instance.LoadAssest<GameObject>(key);
GameObject clone = GameObject.Instantiate(pfb, path, false);
uimdic.Add(key, clone.GetComponent<UIBase>());
}
uimdic[key].Open();
}
public void Close(string key)
{
//关闭我就不想写了,如果需要判断,你们自己加吧
uimdic[key].Close();
}
//嗯,这个是获取
public UIBase GetUI(string key)
{
if (uimdic.ContainsKey(key))
{
return uimdic[key];
}
return null;
}
}
来源:https://blog.csdn.net/weixin_43863320/article/details/99684493