区块链技术博客
www.b2bchain.cn

Unity 游戏框架搭建 2019 (七十四) MainManager求职学习资料

本文介绍了Unity 游戏框架搭建 2019 (七十四) MainManager求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我们这次整理阶段准备了好久,终于可以进入学习阶段了。
先列出 Manager Of Managers 如下:

  • MainManager: 作为入口管理器。
  • EventManager: 消息管理。
  • GUIManager: 图形视图管理。
  • AudioManager: 音效管理。
  • PoolManager: GameObject管理(减少动态开辟内存消耗,减少GC)。
  • LevelManager: 关卡管理。
  • GameManager: 游戏管理。
  • SaveManager: 配置&存储管理。
  • MenuManager 菜单管理。

我们今天来实现第一个,MainManager,入口管理器。

什么是入口管理器?

字如其意,就是用来管理入口的。

既然称得上是管理,那么我们的项目肯定是有多个入口的,除了有多个入口之外呢,入口处也有可能有多个流程,比如资源加载流程、第三方 SDK 启动流程、热更新检测等等,都是在入口处完成的。

到这里,我们要解决的问题,也就是 MainManager 的职责有点眉目了:

  1. 管理多个入口。
  2. 负责游戏的启动流程。

第二个问题我们可以理解,但是第一个问题,为什么会有多个入口需要管理?

为什么需要多个入口?

我们在一开始做项目的时候,每次改一点点代码(或者不止一点点),要看更改的结果就要启动游戏-> Loading 界面 -> 点击各种按钮 ->跳转到目标界面等,经过一系列的操作才能看到更改的结果,或者 Log 之类的。这样非常浪费时间的,如果每天按照需要 10 次这种行为,就会浪费很多时间,如果按照时薪算的话,那就是……很多钱。

流程图是这样的:
Unity 游戏框架搭建 2019 (七十四) MainManager

006tNc79ly1fsb2wkfk24j30gj080jrj.jpg

为什么会出现这种问题呢?

  1. 模块间的耦合度太高了。下一个模块要依赖前一个模块的一些数据或者逻辑。
  2. 或者有可能是这个模块设计得太大了,界面太多,也会发生这种情况。

解决方案

针对问题 1:在模块的入口提供一个测试接口,用来写这个模块的资源加载或者数据初始化的逻辑。
针对问题 2:在模块的入口提供一个测试接口,写跳转到目标界面的相关代码。
流程图是这样的:
Unity 游戏框架搭建 2019 (七十四) MainManager

006tKfTcgy1frost3hq0ij30gz0bfaaf.jpg

虽然很简单,但是解决了问题。

阶段的划分

资源加载乱七八糟的代码和最好能一步跳转到目标界面的代码,需要在出包或者跑完整游戏流程的时候失效。
如何做到?
答案就是阶段的划分。
我们的框架里分为如下几个阶段:

  1. 开发阶段:不断地编码->验证结果->编码->验证结果->…….
  2. 出包/真机阶段:这个阶段主要是跑完整流程,在真机上跑跑,给 QA 测测。
  3. 发布阶段:上线。

对应的枚举:

public enum EnvironmentMode {     Developing,     QA,     Release }

很明显,乱七八糟的代码是要在开发阶段是有效的,但是在 QA 或者 Release 版本中无效的。那么只要在游戏的入口处判断当前在什么阶段就好了。

代码如下:

using UnityEngine;  namespace QFramework {     public enum EnvironmentMode     {         Developing,         Test,         Production     }      public class MainManager : MonoBehaviour     {         public EnvironmentMode Mode;          // Use this for initialization         void Start()         {             if (Mode == EnvironmentMode.Developing)             {                 // 测试逻辑             }             else             {                 // 正常逻辑             }         }     } }

可以看到在 Start 方法里对 Mode 进行了判断。不过如果这样去写的话我们的 MainManager 就会在别的项目中不能复用,因为 MainManager 作为 Manager Of Managers 之一,它不能在代码本身写项目有关的逻辑,因为它是框架层的脚本。

那要怎么办呢?答案是通过继承。

如何通过继承搞定?
我们看代码就知道了,代码如下:

using UnityEngine;  namespace QFramework {     public enum EnvironmentMode     {         Developing,         Test,         Production     }      public abstract class MainManager : MonoBehaviour     {         public EnvironmentMode Mode;          private void Start()         {             switch (Mode)             {                 case EnvironmentMode.Developing:                     LaunchInDevelopingMode();                     break;                 case EnvironmentMode.Test:                     LaunchInTestMode();                     break;                 case EnvironmentMode.Production:                     LaunchInProductionMode();                     break;             }         }          protected abstract void LaunchInDevelopingMode();          protected abstract void LaunchInProductionMode();          protected abstract void LaunchInTestMode();     } }

首先我们的 MainManager 变成了一个抽象类,也就是说,不希望大家直接用。而是通过继承去使用。当然这个类本身问题很多,不过我们可以通过做一些小示例来发现问题并解决。

到这里,这个类呢,可以满足我们的切换入口的问题,当然呢,也支持了几种阶段。那么我们接下来,开始写小示例。

我们这次整理阶段准备了好久,终于可以进入学习阶段了。
先列出 Manager Of Managers 如下:

  • MainManager: 作为入口管理器。
  • EventManager: 消息管理。
  • GUIManager: 图形视图管理。
  • AudioManager: 音效管理。
  • PoolManager: GameObject管理(减少动态开辟内存消耗,减少GC)。
  • LevelManager: 关卡管理。
  • GameManager: 游戏管理。
  • SaveManager: 配置&存储管理。
  • MenuManager 菜单管理。

我们今天来实现第一个,MainManager,入口管理器。

什么是入口管理器?

字如其意,就是用来管理入口的。

既然称得上是管理,那么我们的项目肯定是有多个入口的,除了有多个入口之外呢,入口处也有可能有多个流程,比如资源加载流程、第三方 SDK 启动流程、热更新检测等等,都是在入口处完成的。

到这里,我们要解决的问题,也就是 MainManager 的职责有点眉目了:

  1. 管理多个入口。
  2. 负责游戏的启动流程。

第二个问题我们可以理解,但是第一个问题,为什么会有多个入口需要管理?

为什么需要多个入口?

我们在一开始做项目的时候,每次改一点点代码(或者不止一点点),要看更改的结果就要启动游戏-> Loading 界面 -> 点击各种按钮 ->跳转到目标界面等,经过一系列的操作才能看到更改的结果,或者 Log 之类的。这样非常浪费时间的,如果每天按照需要 10 次这种行为,就会浪费很多时间,如果按照时薪算的话,那就是……很多钱。

流程图是这样的:
Unity 游戏框架搭建 2019 (七十四) MainManager

006tNc79ly1fsb2wkfk24j30gj080jrj.jpg

为什么会出现这种问题呢?

  1. 模块间的耦合度太高了。下一个模块要依赖前一个模块的一些数据或者逻辑。
  2. 或者有可能是这个模块设计得太大了,界面太多,也会发生这种情况。

解决方案

针对问题 1:在模块的入口提供一个测试接口,用来写这个模块的资源加载或者数据初始化的逻辑。
针对问题 2:在模块的入口提供一个测试接口,写跳转到目标界面的相关代码。
流程图是这样的:
Unity 游戏框架搭建 2019 (七十四) MainManager

006tKfTcgy1frost3hq0ij30gz0bfaaf.jpg

虽然很简单,但是解决了问题。

阶段的划分

资源加载乱七八糟的代码和最好能一步跳转到目标界面的代码,需要在出包或者跑完整游戏流程的时候失效。
如何做到?
答案就是阶段的划分。
我们的框架里分为如下几个阶段:

  1. 开发阶段:不断地编码->验证结果->编码->验证结果->…….
  2. 出包/真机阶段:这个阶段主要是跑完整流程,在真机上跑跑,给 QA 测测。
  3. 发布阶段:上线。

对应的枚举:

public enum EnvironmentMode {     Developing,     QA,     Release }

很明显,乱七八糟的代码是要在开发阶段是有效的,但是在 QA 或者 Release 版本中无效的。那么只要在游戏的入口处判断当前在什么阶段就好了。

代码如下:

using UnityEngine;  namespace QFramework {     public enum EnvironmentMode     {         Developing,         Test,         Production     }      public class MainManager : MonoBehaviour     {         public EnvironmentMode Mode;          // Use this for initialization         void Start()         {             if (Mode == EnvironmentMode.Developing)             {                 // 测试逻辑             }             else             {                 // 正常逻辑             }         }     } }

可以看到在 Start 方法里对 Mode 进行了判断。不过如果这样去写的话我们的 MainManager 就会在别的项目中不能复用,因为 MainManager 作为 Manager Of Managers 之一,它不能在代码本身写项目有关的逻辑,因为它是框架层的脚本。

那要怎么办呢?答案是通过继承。

如何通过继承搞定?
我们看代码就知道了,代码如下:

using UnityEngine;  namespace QFramework {     public enum EnvironmentMode     {         Developing,         Test,         Production     }      public abstract class MainManager : MonoBehaviour     {         public EnvironmentMode Mode;          private void Start()         {             switch (Mode)             {                 case EnvironmentMode.Developing:                     LaunchInDevelopingMode();                     break;                 case EnvironmentMode.Test:                     LaunchInTestMode();                     break;                 case EnvironmentMode.Production:                     LaunchInProductionMode();                     break;             }         }          protected abstract void LaunchInDevelopingMode();          protected abstract void LaunchInProductionMode();          protected abstract void LaunchInTestMode();     } }

首先我们的 MainManager 变成了一个抽象类,也就是说,不希望大家直接用。而是通过继承去使用。当然这个类本身问题很多,不过我们可以通过做一些小示例来发现问题并解决。

到这里,这个类呢,可以满足我们的切换入口的问题,当然呢,也支持了几种阶段。那么我们接下来,开始写小示例。

我们这次整理阶段准备了好久,终于可以进入学习阶段了。
先列出 Manager Of Managers 如下:

  • MainManager: 作为入口管理器。
  • EventManager: 消息管理。
  • GUIManager: 图形视图管理。
  • AudioManager: 音效管理。
  • PoolManager: GameObject管理(减少动态开辟内存消耗,减少GC)。
  • LevelManager: 关卡管理。
  • GameManager: 游戏管理。
  • SaveManager: 配置&存储管理。
  • MenuManager 菜单管理。

我们今天来实现第一个,MainManager,入口管理器。

什么是入口管理器?

字如其意,就是用来管理入口的。

既然称得上是管理,那么我们的项目肯定是有多个入口的,除了有多个入口之外呢,入口处也有可能有多个流程,比如资源加载流程、第三方 SDK 启动流程、热更新检测等等,都是在入口处完成的。

到这里,我们要解决的问题,也就是 MainManager 的职责有点眉目了:

  1. 管理多个入口。
  2. 负责游戏的启动流程。

第二个问题我们可以理解,但是第一个问题,为什么会有多个入口需要管理?

为什么需要多个入口?

我们在一开始做项目的时候,每次改一点点代码(或者不止一点点),要看更改的结果就要启动游戏-> Loading 界面 -> 点击各种按钮 ->跳转到目标界面等,经过一系列的操作才能看到更改的结果,或者 Log 之类的。这样非常浪费时间的,如果每天按照需要 10 次这种行为,就会浪费很多时间,如果按照时薪算的话,那就是……很多钱。

流程图是这样的:
Unity 游戏框架搭建 2019 (七十四) MainManager

006tNc79ly1fsb2wkfk24j30gj080jrj.jpg

为什么会出现这种问题呢?

  1. 模块间的耦合度太高了。下一个模块要依赖前一个模块的一些数据或者逻辑。
  2. 或者有可能是这个模块设计得太大了,界面太多,也会发生这种情况。

解决方案

针对问题 1:在模块的入口提供一个测试接口,用来写这个模块的资源加载或者数据初始化的逻辑。
针对问题 2:在模块的入口提供一个测试接口,写跳转到目标界面的相关代码。
流程图是这样的:
Unity 游戏框架搭建 2019 (七十四) MainManager

006tKfTcgy1frost3hq0ij30gz0bfaaf.jpg

虽然很简单,但是解决了问题。

阶段的划分

资源加载乱七八糟的代码和最好能一步跳转到目标界面的代码,需要在出包或者跑完整游戏流程的时候失效。
如何做到?
答案就是阶段的划分。
我们的框架里分为如下几个阶段:

  1. 开发阶段:不断地编码->验证结果->编码->验证结果->…….
  2. 出包/真机阶段:这个阶段主要是跑完整流程,在真机上跑跑,给 QA 测测。
  3. 发布阶段:上线。

对应的枚举:

public enum EnvironmentMode {     Developing,     QA,     Release }

很明显,乱七八糟的代码是要在开发阶段是有效的,但是在 QA 或者 Release 版本中无效的。那么只要在游戏的入口处判断当前在什么阶段就好了。

代码如下:

using UnityEngine;  namespace QFramework {     public enum EnvironmentMode     {         Developing,         Test,         Production     }      public class MainManager : MonoBehaviour     {         public EnvironmentMode Mode;          // Use this for initialization         void Start()         {             if (Mode == EnvironmentMode.Developing)             {                 // 测试逻辑             }             else             {                 // 正常逻辑             }         }     } }

可以看到在 Start 方法里对 Mode 进行了判断。不过如果这样去写的话我们的 MainManager 就会在别的项目中不能复用,因为 MainManager 作为 Manager Of Managers 之一,它不能在代码本身写项目有关的逻辑,因为它是框架层的脚本。

那要怎么办呢?答案是通过继承。

如何通过继承搞定?
我们看代码就知道了,代码如下:

using UnityEngine;  namespace QFramework {     public enum EnvironmentMode     {         Developing,         Test,         Production     }      public abstract class MainManager : MonoBehaviour     {         public EnvironmentMode Mode;          private void Start()         {             switch (Mode)             {                 case EnvironmentMode.Developing:                     LaunchInDevelopingMode();                     break;                 case EnvironmentMode.Test:                     LaunchInTestMode();                     break;                 case EnvironmentMode.Production:                     LaunchInProductionMode();                     break;             }         }          protected abstract void LaunchInDevelopingMode();          protected abstract void LaunchInProductionMode();          protected abstract void LaunchInTestMode();     } }

首先我们的 MainManager 变成了一个抽象类,也就是说,不希望大家直接用。而是通过继承去使用。当然这个类本身问题很多,不过我们可以通过做一些小示例来发现问题并解决。

到这里,这个类呢,可以满足我们的切换入口的问题,当然呢,也支持了几种阶段。那么我们接下来,开始写小示例。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Unity 游戏框架搭建 2019 (七十四) MainManager求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们