E大的Demo框架,代码主要分为三部分。
Assets/UnityGameFramework/GameFramework:GF框架
Assets/UnityGameFramework/Scripts:UGF框架
Assets/GameMain/Scripts:Demo框架
Demo框架入口:GameEntry
Assets\GameMain\Scripts\Base\GameEntry.cs
初始化获取所有组件,获取前各个组件自身的awake方法已完成注册,注册的地方往下看unity框架入口。
unity框架入口:GameEntry
Assets\UnityGameFramework\Scripts\Runtime\Base\GameEntry.cs
相关属性及方法:
s_GameFrameworkComponents:
GameFrameworkLinkedList
游戏框架链表类,存储所有框架组件,注册组件时加入链表。
GameFrameworkSceneId:
游戏框架所在场景编号,设置值为0。场景组件会用到该属性,用来获取框架所在场景。
T GetComponent() :
获取游戏框架组件。
Shutdown(ShutdownType):
关闭游戏框架,切换语言,版本检测,资源更新,退出游戏时会调用。
关闭框架时传入类型枚举如下
public enum ShutdownType : byte
{
None = 0,//仅关闭游戏框架
Restart,//关闭游戏框架并重启游戏
Quit,// 关闭游戏框架并退出游戏
}
一般不会使用仅关闭游戏框架,只有在Debug调试的目录下有这个功能,会清除框架自带的所有组件,自定义的组件不会清除,框架的游戏入口仍然会保留。重启时会依据GameFrameworkSceneId加载游戏框架所在的场景。
RegisterComponent(GameFrameworkComponent):
注册框架组件,所有的框架组件在框架预制件中都有实体。游戏启动时,组件中的Aweak方法会首先调用该函数,将组件自身添加到游戏框架链表类中以完成组件注册。注册完成后,Demo框架入口GameEntry的Start会获取所有组件,方便后续调用框架组件的功能。
原生框架入口:GameFrameworkEntry
Assets\UnityGameFramework\GameFramework\Base\GameFrameworkEntry.cs
相关属性及方法:
s_GameFrameworkModules:
GameFrameworkLinkedList
游戏框架模块链表。
Update:
游戏框架模块轮询。
该方法由unity框架基础组件BaseComponent在update方法中调用,以完成每一帧调用模块。
Shutdown:
关闭并清理所有游戏模块框架,BaseComponent在OnDestroy方法中调用。
GetModule:
获取框架模块,没有时则会创建。
创建类的实例方法如下:
GameFrameworkModule module = (GameFrameworkModule)Activator.CreateInstance(moduleType);
总结
三个框架入口中,我们很容易发现Demo框架入口与unity框架入口的联系,关系很清晰。但是原生框架的入口与unity框架入口的联系很模糊,只有unity框架的基础组件BaseComponent与原生框架入口建立了联系,以完成轮询和删除框架模块。
通过查找GetModule方法的引用,我们可以发现unity框架的组件会获取原生框架的模块,大体上来说是一一对应的关系。
具体是怎样的对应关系,是依据什么来获取模块的,我们继续往下学习。