代码参考

见工程MgrBase、GameManager等代码文件,工程参考第零章工程说明

概述

在游戏的项目中,有一些APP中阶段的转换节点,如:进入App,登录,切地图等。通常有一些模块只在某个阶段被使用,比如:在玩家登录后启动玩家资产管理模块,玩家切地图清理(或刷新)地图资源管理模块等等。还要注意的是这些模块之间,会有顺序耦合的关系,如:组队模块要在角色数据管理模块后初始化,不如拿不到角色数据。

思路

生命周期管理

在游戏开发项目中常常使用模块化开发,常常定义“管理者类”来管理各个模块。有些模块如网络模块在进入游戏被初始化,而有些模块如玩家管理模块直到玩家登录时才被加载,而当玩家注销返回登录界面时被清理,定义一个管理者类,包含以下行为:

  • 初始化
  • 唤醒
  • 休眠
  • 释放

处理不同模块之间的依赖

例如脚本模块依赖于资源管理模块加载脚本,这样资源管理模块必须在脚本模块初始化之前初始化并在脚本模块被释放之后释放。定义一个管理者的管理者,这个类可以使用U3D的GameManager类。

  • 在某个时机如进入游戏、玩家登录按遍历初始化模块并再次遍历唤醒模块,这样可以保证在相互依赖的时候能成功的初始化模块。类似的,在某个时机如退出登录返回大厅,先遍历休眠模块再遍历释放模块
  • 因为U3D和开发者约定GameManager是个Mono脚本,挂载在场景的GameObj里。这样那些Mono管理者的GameObj可以以某种策略挂载在GameManager的GameObj上。

详解

  • GameManager 是一个和U3D约定的特殊的类,定义它为单例作为所有管理者的管理者,通过静态注册的方式注册各个节点的模块,并在管理这些模块的生命周期(见下文)。
  • MgrRegister 静态的模块管理者注册器,通过这个类来静态配置模块的生命周期节点
  • MgrBase 管理者基类
  • MonoMgrBase Mono类型的管理者基类

其运行机制以玩家登录为例:玩家进入游戏后的状态为登录状态,此时选择服务器登录进入游戏状态。在选择服务器进入时,通知GameManager切换状态,触发模块管理机制:首先把运行在登录状态下的模块清理掉,加载游戏状态的模块。当然这里的状态节点是简化的,根据需求可能会有其他如:整个APP,大厅,战斗等生命周期。

生命周期开始和结束都会进行两次遍历如图所示,其主要目的在于可以在两次遍历中处理依赖,避免循环依赖。比如组队模块的初始化依赖角色模块,而角色模块又有对组队模块的引用,通常这种对其他模块有依赖或者引用初始化,放在第二次遍历,这里是Start,第一次遍历的初始化只初始化本模块相关的。这样可以保证,其依赖引用的模块一定被初始化了。释放的逻辑类似。

备注

  • Mono的Mgr的单例在Awake里手动初始化
  • C# 语言有反射的特性,也可以在程序初始化的时候使用反射分析特性(Attrbute)标签或者继承类型进行注册

U3DFrameWorkDemo:一、生命周期管理的更多相关文章

  1. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  2. 【转】Tomcat组件生命周期管理

    Tomcat组件生命周期管理 Tomcat中Server,Service,Connector,Engine,Host,Context,它们都实现了org.apache.catalina.Lifecyc ...

  3. Castle IOC容器组件生命周期管理

    主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...

  4. Java实现生命周期管理机制

    先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然 ...

  5. 6、Khala的登录生命周期管理

    khala能够对设备进行生命周期管理,并提供了与生命周期相关的接口,用户只需在具体的设备类型实现类中重写这些生命周期接口,即可享受khala对于生命周期管理的同时定制与业务相关的操作.具体接口解释如下 ...

  6. 依赖注入及AOP简述(十一)——生命周期管理 .

    2.     生命周期管理 各种依赖注入框架提供了替开发者管理各种Scope的便利功能,随之而来的就必然是被管理的依赖对象的生命周期管理的问题.所谓生命周期管理,就是一个对象在它所属的Scope中从被 ...

  7. Windows 8 动手实验系列教程 实验5:进程生命周期管理

    动手实验 实验5:进程生命周期管理 2012年9月 简介 进程生命周期管理对构建Windows应用商店应用的开发者来说是需要理解的最重要的概念之一.不同于传统的Windows应用(它们即使在后台仍然继 ...

  8. 快速构建Windows 8风格应用30-应用生命周期管理

    原文:快速构建Windows 8风格应用30-应用生命周期管理 引言 Windows 8 中可以启动多个应用并在其中切换,我们没有必要担心降低系统速度或消耗电池电量. 因为系统会自动挂起(有时会终止) ...

  9. Akka(2):Actor生命周期管理 - 监控和监视

    在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式.对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式 ...

  10. Salesforce 应用生命周期管理

    应用程序生命周期管理 一个Salesforce系统可以有多个版本,最常见的有: production版本:终端用户实际使用的版本 sandbox版本:沙盒环境,用于开发.测试等 在对Salesforc ...

随机推荐

  1. HDFS目录配额(quota)不足导致写文件失败

    本文分享自天翼云开发者社区<HDFS目录配额(quota)不足导致写文件失败>,作者:5****m 问题背景与现象 给某目录设置quota后,往目录中写文件失败,出现如下问题"T ...

  2. AI应用实战课学习总结(11)用RNN做时序预测

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第11站,一起了解RNN循环神经网络的基本概念 以及 通过RNN来做时序 ...

  3. C++ set/multiset容器 学习总结

    -------------------------------------set/multiset容器 set/multiset特性 set/multiset的特性是所有元素会根据元素的值自动进行排序 ...

  4. Rust修仙之道 第二章:气流变换 · 驭控条件与循环之术

    第二章:气流变换 · 驭控条件与循环之术 在掌握变量与法印函数之后,顾行云进入了修炼的下一个瓶颈--如何让灵气术式随境而变.适时而动? 他夜读<Rust·变通篇>,心有所感:"灵 ...

  5. lora网关采集温室大棚温湿度数据案例

      1.概述 运用lora网关远程控制温室大棚内风机,日光灯,温湿度传感器等设备.可以实现远程获取现场环境的空气温湿度.土壤水分温度.二氧化碳浓度.光照强度可以自动控制温室湿帘风机.喷淋滴灌.加温补光 ...

  6. Oracle中复杂数据处理

    利用聚合函数统计数据 求最大值-max() max()可应用数值型和字符型和日期型(实质也是数值型) select max(employee_age) max_age from employees m ...

  7. 斐讯n1进入u盘启动

    前言 我将n1刷完电视系统后,看了几天电视,发现还行吧. 过了几天,突然想玩游戏,发现插入u盘重启,依然进入电视,并不进入u盘的游戏机系统. 提供以下脚本,局域网下其他远程设备执行即可. window ...

  8. 【EF Core】框架是如何识别实体的属性和主键v

    在上一篇水文中,老周生动形象地解释了 DbContext 是如何识别实体 Set 的,大伙伴们可能会产生新的疑惑:实体是识别了,但,实体的属性或字段列表,它是怎么识别并映射给数据表的列的呢? 用过 E ...

  9. 前端开发系列068-JQuery篇之框架的选择器

    一.jQuery选择器说明 jQuery 最核心的组成部分就是选择器引擎.它完全继承了 CSS 的风格,可以对 DOM 元 素的标签名.属性名.状态等进行快速准确的选 择,而且不必担心浏览器的兼容性, ...

  10. ARM Cortex-M3/M4初学习(未完待续)

    ARM Cortex-M3/M4初学习 0. 架构与核心特性 0.1 指令集架构 基于ARMv7-M架构,支持Thumb-2指令集(混合16/32位指令集) 基于哈佛架构,数据和指令分布存储在独立的空 ...