公司动态
GameFrameWork框架学习保姆级——Base——GameFrameworkEntry
开个新坑学习的时候东西都在笔记上写着但是本身就是抽时间学所以时间一长就把前面的忘掉了。从GameFrameWork框架源码开始看每次如果我感觉前面的东西忘了就写篇文章复习XD。GameFrameworkEntry.cs首先它是一个静态类目的是为了在任何地方都可以调用到。第一个变量是负责存储GF框架所有模块的GameFrameworkLinkedList类是GF框架封装的一个LinkedList类型但是消耗低之后看GameFrameworkModule是游戏模块类比如什么音效模块什么UI模块这些总的或者自己实现的一些模块都可以继承这个类型。这个Update方法用来遍历刚刚 s_GameFrameworkModules 里存储的每一个模块然后执行这个模块的更新方法。至于两个参数第一个参数是逻辑时间假如游戏变速了比如加快或者变慢那么这个时间也会跟着变慢或者变快第二个时间是真实流逝的时间也就是加减速并不影响它的计时。举个例子比如五秒后玩家起飞但是现在速度游戏速度调慢了1倍那么就需要真实时间的十秒那么timescale的值越小间隔就越小第一个参数的值就越小因为真实时间走一秒假设原本间隔时间是0.02stimescale缩小变慢后就成了0.01对应的游戏间隔时间可能才算走一点点。如果是第二个参数如果还是五秒后玩家起飞游戏速度又慢了1倍但是这并不影响它的计时也就是真实世界的五秒后起飞。传进来的参数是现实中五秒对应的每一帧的间隔值也就是改变游戏速度完全不影响计时。停止所有模块先通过遍历GF框架链表的方式执行每一个模块的关闭方法执行结束后清理所有模块清理缓存池等。获取模块获取的泛型类型必须是一个类。先得到T的类型泛型必须是接口防止传入实现类属于“约定优于配置”理念下的强制约束接口固定对应的一个实现。然后判断接口的命名空间开始的全名StartsWith(“GameFramework.”, StringComparison.Ordinal)检查该完整名称是否以 “GameFramework.” 开头。StringComparison.Ordinal 表示使用字节级比较区分大小写、最快避免因区域性Culture导致的意外行为。如果不以该前缀开头则抛出 GameFrameworkException框架自定义异常并附带格式化错误信息明确指出传入的类型不是合法的 Game Framework 模块。然后通过拼接命名空间和类型名称得到模块的名称然后通过 Type.GetType(moduleName) 来得到对应的类型如果没有得到报错得到的话再调用下面这个GetModule方法传递Type类型得到GameFrameworkModule模块后父转子为T类型后返回。interfaceType.Namespace获取接口的命名空间例如 “GameFramework.Resource”。interfaceType.Name获取接口的短名称不含命名空间例如 “IResourceManager”。.Substring(1)从索引 1 开始截取即去掉第一个字符。若接口名以 I 开头约定则得到 “ResourceManager”。这也说明了GF框架中的一个约定对于模块来说需要遵守接口应该以大写I开头比如IResourceManager具体实现的是ResourceManager这样才能通过GetModule方法来获取具体的模块。这个是内部具体的获取模块的方法其实就是遍历每一个s_GameFrameworkModules存的模块因为GameFrameworkModule是class类型所以有object的方法所以调用它的GetType获取类型来判断传入的Type类型的moduleType是否匹配如果匹配就返回如果没有那么就调用 CreateModule方法 直接创建一个模块。首先通过反射创建一个对应类型的实例然后强转GameFrameworkModule如果没转过来成null了直接抛出异常不能创建这个模块如果转成功了创建一个 LinkedListNode (它是一个链表节点类节点对应的value的类型是GameFrameworkModule)让它先引用s_GameFrameworkModules所有模块的第一个然后开始从头遍历(注意头部的Property是最大的降序排列)直到这个新的模块的Priority优先级小于当前遍历中的模块的层级退出循环后如果current为空也就是遍历到底了都没有比新模块优先级小的就把这个新模块放到最后否则放到current对应模块的前面(因为break的时候没有执行current current.Next 所以对应的current还是比当前模块小的那个)。