框架的基础搭建

下面我们开始对框架的搭建(一些基类就不做介绍)

//整个框架的入口
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值