GameFramework框架 (二) GameEntry
Static 变量
static变量,在内存中只有一份,值占用一份内存区域
可以通过类名直接访问静态变量
GameEntry
public partial class GameEntry : MonoBehaviour{private void Start(){InitBuiltinComponents();InitCustomComponents();}}public partial class GameEntry : MonoBehaviour{/// <summary>/// 获取游戏基础组件。静态变量可以通过类名使用/// </summary>public static BaseComponent Base{get;private set;}...private static void InitBuiltinComponents(){Base = UnityGameFramework.Runtime.GameEntry.GetComponent<BaseComponent>(); }}
问题:在InitBuiltinComponents方法中使用GetComponent方法给静态变量赋值,那么有没有可能是 获取的是Null呢?
我们随便点开一个组件,比如BaseComponent组件,这个组件继承自GameFrameworkComponent,在Awake中调用了 RegisterComponent, 注册操作实质上是吧自己(this)添加到了组件列表中;
public sealed class BaseComponent : GameFrameworkComponent{private const int DefaultDpi = 96; // default windows dpiprivate float m_GameSpeedBeforePause = 1f;[SerializeField]private bool m_EditorResourceMode = true;[SerializeField]private Language m_EditorLanguage = Language.Unspecified;....}public abstract class GameFrameworkComponent : MonoBehaviour{/// <summary>/// 游戏框架组件初始化。/// </summary>protected virtual void Awake(){GameEntry.RegisterComponent(this);}}internal static void RegisterComponent(GameFrameworkComponent gameFrameworkComponent){if (gameFrameworkComponent == null){Log.Error("Game Framework component is invalid.");return;}Type type = gameFrameworkComponent.GetType();LinkedListNode<GameFrameworkComponent> current = s_GameFrameworkComponents.First;//遍历列表,while (current != null){//如果当前组件已经存在了,returnif (current.Value.GetType() == type){Log.Error("Game Framework component type '{0}' is already exist.", type.FullName);return;}current = current.Next;}//添加到列表s_GameFrameworkComponents.AddLast(gameFrameworkComponent);}
执行顺序
上图中这个GameObject上挂的各种组件,都是继承自 GameFrameworkCompont, 游戏启动后,会先执行Awake方法,在Awake方法中调用 ResgisterComponent方法,把自己添加到 列表中;
在Awake执行完成后会执行 OnEnable 函数, 之后执行 Start函数, 这里会执行到GameEntry中的InitBuiltinComponents(); 使用GetComponent获取List中的组件
public static T GetComponent<T>() where T : GameFrameworkComponent{return (T)GetComponent(typeof(T));}/// <summary>/// 获取游戏框架组件。/// </summary>/// <param name="type">要获取的游戏框架组件类型。</param>/// <returns>要获取的游戏框架组件。</returns>public static GameFrameworkComponent GetComponent(Type type){LinkedListNode<GameFrameworkComponent> current = s_GameFrameworkComponents.First;while (current != null){if (current.Value.GetType() == type){return current.Value;}current = current.Next;}return null;}
如果使用GameEntry.CustomXXXComponent没有获取组件,可能是什么原因?
1. 检查GameEntry脚本中是否添加了 新的静态属性, 是否在 InitCustomComponents 中 实现了 赋值操作;
2. 检查自定义的组件是否 继承自 GameFrameworkCompont
3. 检查 unity中是否挂了 自定义的组件脚本
总结: GameEntry 本质上就是一个容器, 可以把其他组件 定义为静态属性,从而方便获取; 有的框架喜欢把组件定义为单例,效果其实差不多
GameEntry中已经持有了 21个组件,后面开始学习 这21个组件,
private static void InitCustomComponents(){BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();HPBar = UnityGameFramework.Runtime.GameEntry.GetComponent<HPBarComponent>();}private static void InitBuiltinComponents(){Base = UnityGameFramework.Runtime.GameEntry.GetComponent<BaseComponent>();Config = UnityGameFramework.Runtime.GameEntry.GetComponent<ConfigComponent>();DataNode = UnityGameFramework.Runtime.GameEntry.GetComponent<DataNodeComponent>();DataTable = UnityGameFramework.Runtime.GameEntry.GetComponent<DataTableComponent>();Debugger = UnityGameFramework.Runtime.GameEntry.GetComponent<DebuggerComponent>();Download = UnityGameFramework.Runtime.GameEntry.GetComponent<DownloadComponent>();Entity = UnityGameFramework.Runtime.GameEntry.GetComponent<EntityComponent>();Event = UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponent>();FileSystem = UnityGameFramework.Runtime.GameEntry.GetComponent<FileSystemComponent>();Fsm = UnityGameFramework.Runtime.GameEntry.GetComponent<FsmComponent>();Localization = UnityGameFramework.Runtime.GameEntry.GetComponent<LocalizationComponent>();Network = UnityGameFramework.Runtime.GameEntry.GetComponent<NetworkComponent>();ObjectPool = UnityGameFramework.Runtime.GameEntry.GetComponent<ObjectPoolComponent>();Procedure = UnityGameFramework.Runtime.GameEntry.GetComponent<ProcedureComponent>();Resource = UnityGameFramework.Runtime.GameEntry.GetComponent<ResourceComponent>();Scene = UnityGameFramework.Runtime.GameEntry.GetComponent<SceneComponent>();Setting = UnityGameFramework.Runtime.GameEntry.GetComponent<SettingComponent>();Sound = UnityGameFramework.Runtime.GameEntry.GetComponent<SoundComponent>();UI = UnityGameFramework.Runtime.GameEntry.GetComponent<UIComponent>();WebRequest = UnityGameFramework.Runtime.GameEntry.GetComponent<WebRequestComponent>();}
下一篇学习:组件之 ProcedureComponent, 敬请期待,如有错误或不解的地方,还请留言,谢谢!
GameFramework框架 (二) GameEntry相关推荐
- GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条
前言: 游戏在转换场景的时候,需要花费时间来加载相关的资源.而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到). 所以,如果这一小段时间,画面就卡在这 ...
- GameFramework框架知识
目录 工程资源 一.加载Excel配置表的txt文件(读写) 二.GameFramework之Procedure流程 工程资源 https://github.com/AMikeW/BStandShad ...
- GameFramework框架详解之 Sound声音管理
一.前言 虽然现在大厂的大项目可以选择想Wwise这类的音频插件来进行声音的开发,不需要什么声音模块管理了,但是我们也知道,小公司或者小项目组,是用不起这种收费软件的,所以大部分的项目还是需要我们自己 ...
- 从0开始学Unity做SLG系列(GameFramework框架)
目录 GameFramework框架启动流程 GameFramework框架启动流程 找了2个系列教程,照着写完后,应该就有些基础了解了. 先看第一篇 StarForce 在看第二篇 Flappy ...
- Jersey框架二:Jersey对JSON的支持
Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...
- Java开源 J2EE框架(二)
Java开源 J2EE框架(二) 2007-01-06 12:34 Jofti [Java开源 其它开源项目] Jofti可对在缓存层中(支持EHCache,JBossCache和OSCache)的对 ...
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- pytest框架二次开发之自定义注解
目录 一.背景: 二.闭包与装饰器(可以跳过这一章) 2.1 .什么是闭包 2.2 闭包的用途 2.3 .装饰器(decorator) 三.pytest自定义注解@author 3.1 自定义注解@a ...
- 胖虎谈ImageLoader框架(二)
前言 从学校出来的这半年时间,发现很少有时间可以静下来学习和写博文了,为了保持着学习和分享的习惯,我准备之后每周抽出一部分时间为大家带来一个优秀的Android框架源码阅读后的理解系列博文. 期许:希 ...
- Spring框架(二)
Spring框架(二) 一.控制反转IOC和依赖注入DI 控制反转和依赖注入是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同.控制反转是说不需要程序员管理和控制bean,是解耦的目的,而 ...
最新文章
- 纹身电极: 一种新型的可以进行脑信号测量的电极
- 2021年下信息系统项目管理师真题各章节占分比
- (08)System Verilog 队列详解
- 语音识别(3)---语音识别技术原理
- 阿里巴巴宣布架构调整:集中发力推进三大战略 程立任集团CTO
- linux大量生成测试文件,Shell脚本创建指定大小文件的测试数据
- Spark SQL运行架构
- stm32 代码加密
- 时间序列分析中的增长率——同比与环比
- 使用python制作属于自己的地铁图
- Unicode码和ASCII码及其转换
- matplotlib(直方图,条形图,饼图,散点图)基础知识
- Unreal Engine C++ 入门01
- 最全 | 全国31个省市区重点产业布局
- matlab抢占时隙算法,ALOHA anti-collision、二进制数搜索算法以及帧时隙算法
- js将秒转为天时分秒格式
- iOS高性能Model转换框架----YYModel学习
- 转载自网易学院 PS打造超级梦幻照片效果
- Android Manifest
- Numpy用法思维导图