下面我们开始对框架的搭建(一些基类就不做介绍)
//整个框架的入口
public class GameLogin : MonoBehaviour
{
//后期对协程功能的拓展会用到
private static GameLogin RunTime;
//游戏的管理者
private iGameCtroller gameCtroller;
private static GameObject rootGo;
//使用特性标志使让方法在场景初始之前被调用
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void Init()
{
//创建出一个游戏物体并且挂在脚本
rootGo = new GameObject("rootTree");
RunTime = rootGo.AddComponent<GameLogin>();
//框架的入口是不可销毁的,因为后续一些updata需要使用所以不能销毁
DontDestroyOnLoad(rootGo);
}
private void Awake()
{
gameCtroller = GameController.instance;
gameCtroller.Start();
}
void Start()
{
gameCtroller.Init();
}
void Update()
{
gameCtroller.Updata();
}
private void FixedUpdate()
{
gameCtroller.FixUpdata();
}
}
下面是对于GameCtorller
//partial 将一个类分成2个cs文件
public partial class GameController : ASingletonBase<GameController>,iGameCtroller
{
//当前流程名
string ProsName = "";
//用来管理流程的运行
bool Running = false;
//IMvcModule MvcBase; 游戏的MVC模块的管理者后期实现该功能会介绍
public IocContainer container { get; private set; }
/// <summary>
/// 游戏的运行流程,可以理解为场景,UI
/// </summary>
public absIntermediaries GameInter { get; private set; }
/// <summary>
/// 这个为不可以销毁游戏物体
/// 更具游戏实际情况
/// </summary>
public absDrontIntermediares DontGameInter { get; private set; }
public void Start()
{
//流程名(可理解为场景名,根据自身的需求定义)
ProsName = "Main";
container = IocContainer.instance;
//注册游戏各个场景模块
container.Register<absIntermediaries , IntermediariesMain>(ProsName);
container.Register<absDrontIntermediares, DrontIntermediares>("DontGame");
//对功能进行IOC组策
container.Register<IObserverModule, ObserverModule>();
container.Register<IMvcModule, MvcModule>();
//标识状态为运行装态
Running = true;
}
//对一些功能的取值
public void Init()
{
DontGameInter =(absDrontIntermediares)container.Resolve<iIntermediaries>("DontGame");
MvcBase = container.Resolve<MvcModule>();
MvcBase.InJectController(container.GetContainer<iIntermediaries>("DontGame"));
Enter(null);
}
}
//第二个cs文件
public partial class GameController
{
public void FixUpdata()
{
}
public void Updata()
{
if (!Running) return;
DontGameInter?.Updata();
GameInter?.Updata();
}
public void Change(string interName, params Object[] obj)
{
ProsName = interName;
GameInter.Exit(Enter);
//如果涉及到多场景,可调用
//DontGameInter 中的遮罩读条UI
}
/// <summary>
/// 这里是通过回调来触发流程的切换,以及把上一流程需要保留的数据发送给Running流程
///对
/// </summary>
/// <param name="obj"></param>
private void Enter(params Object[] obj)
{
if (ProsName == string.Empty) return;
//GameInter = container.Resolve<iIntermediaries>(ProsName); 需要切换的场景名;
//对该流程的Mvc的业务做处理
MvcBase.InJectController(container.GetContainer<iIntermediaries>(ProsName));
//进入该流程
GameInter.Enter(obj);
ProsName = string.Empty;
}
//设置状态
public void SetState()
{
Running = true;
}
}
//流程直接继承该基类即可
public abstract class absDrontIntermediares : iIntermediaries
{
//使用标签标记,因为在GameController组测,所以会被直接获取实例
[Dependency("Dont")] IObserverModule observer; //用来和不可销毁流程沟通观察者
//用来接受自己的controlelr消息的观察者
[Dependency] IObserverModule observerKid;
/// <summary>
/// controller通过订阅该事件来跟其他的controller来沟通
/// </summary>
public static event Action<MessageInfo> Interaction_even;
private ConcurrentQueue<MessageInfo> messages;
public virtual void FixUpdata()
{
}
public virtual void Init()
{
messages = new ConcurrentQueue<MessageInfo>();
//对观察者的事件做注册
observer.Add(MessageEnumEvenDont.Registerbro, ReceiveMessage);
observerKid.Add(MessageEnumEvenDont.Registerkid, ReceiveMessage);
}
private void ReceiveMessage(params object[] obj)
{
ReceiveMessage((MessageInfo)obj[0]);
}
public abstract void Updata();
//用来触发事件
public virtual void GroupMessage()
{
messages.TryDequeue(out MessageInfo message);
if (message == null) return;
Interaction_even?.Invoke(message);
}
public virtual void ReceiveMessage(MessageInfo info)
{
messages.Enqueue(info);
}
}
后期会有observer的介绍还有本人对一些功能模块的理解
public abstract class absDrontIntermediares : iIntermediaries
{
[Dependency("Dont")] IObserverModule observer;
[Dependency] IObserverModule observerKid;
/// <summary>
/// controller通过订阅该事件来跟其他的controller来沟通
/// </summary>
public static event Action<MessageInfo> Interaction_even;
private ConcurrentQueue<MessageInfo> messages;
public virtual void FixUpdata()
{
}
public virtual void Init()
{
messages = new ConcurrentQueue<MessageInfo>();
observer.Add(MessageEnumEvenDont.Registerbro, ReceiveMessage);
observerKid.Add(MessageEnumEvenDont.Registerkid, ReceiveMessage);
}
private void ReceiveMessage(params object[] obj)
{
ReceiveMessage((MessageInfo)obj[0]);
}
public abstract void Updata();
public virtual void GroupMessage()
{
messages.TryDequeue(out MessageInfo message);
if (message == null) return;
Interaction_even?.Invoke(message);
}
public virtual void ReceiveMessage(MessageInfo info)
{
messages.Enqueue(info);
}
}
如有不理解可以联合整体架构了解或者留言!!
下一篇,为打包的分享
https://github.com/wu-qian-qian/wqqFrm.git