1.  

为了重构手头的一款项目,翻出来当时未接触Unity时候收藏的视频《Unity项目架构设计与开发管理》对于我这种初学者来说全是干货。简单的总结了一下,以后慢慢提炼。 关于Unity的架构有如下几种常用的方式。

1.EmptyGO:

  在 Hierarchy 上创建一个空的GameObject,然后挂上所有与 GameObject 无关的逻辑控制的脚本。使用GameObject.Find() 访问对象数据。

缺点:逻辑代码散落在各处,不适合大型项目。

2.Simple GameManager:

  所有与 GameObject 无关的逻辑都放在一个单例中。 缺点:单一文件过于庞大。

3.Manager Of Managers:

将不同的功能单独管理。如下:

  • MainManager: 作为入口管理器。
  • EventManager: 消息管理。
  • GUIManager: 图形视图管理。
  • AudioManager: 音效管理。
  • PoolManager: GameObject管理(减少动态开辟内存消耗,减少GC)。

实现一个简单的 PoolManager:

  1. // 存储动可服用的GameObject。
  2. private List<GameObject> dormantObjects = new List<GameObject>();
  3. // 在dormantObjects获取与go类型相同的GameObject,如果没有则new一个。
  4. public GameObject Spawn(GameObject go)
  5. {
  6. GameObject temp = null;
  7. if (dormantObjects.Count > 0)
  8. {
  9. foreach (GameObject dob in dormantObjects)
  10. {
  11. if (dob.name == go.name)
  12. {
  13. // Find an available GameObject
  14. temp = dob;
  15. dormantObjects.Remove(temp);
  16. return temp;
  17. }
  18. }
  19. }
  20. // Now Instantiate a new GameObject.
  21. temp = GameObject.Instantialte(go) as GameObject;
  22. temp.name = go.name;
  23. return temp;
  24. }
  25. // 将用完的GameObject放入dormantObjects中
  26. public void Despawn(GameObject go)
  27. {
  28. go.transform.parent = PoolManager.transform;
  29. go.SetActive(false);
  30. dormantObject.Add(go);
  31. Trim();
  32. }
  33. //FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。
  34. public void Trim()
  35. {
  36. while (dormantObjects.Count > Capacity)
  37. {
  38. GameObject dob = dormantObjects[0];
  39. dormantObjects.RemoveAt(0);
  40. Destroy(dob);
  41. }
  42. }

缺点:

  • 不能管理prefabs。
  • 没有进行分类。

更好的实现方式是将一个PoolManager分成:

  • 若干个 SpawnPool。

    • 每个 SpawnPool 分成 PrefabPool 和 PoolManager。

      • PrefabPool 负责 Prefab的加载和卸载。
      • PoolManager 与之前的 PoolMananger 功能一样,负责 GameObject 的 Spawn、Despawn 和 Trim。

要注意的是:

  • 每个 SpawnPool 是 EmeptyGO。
  • 每个 PoolManager 管理两个 List (Active,Deactive)。

讲了一堆,最后告诉有一个NB的插件叫 PoolManager- -。

  • LevelManager: 关卡管理。 推荐插件: MadLevelManager。 GameManager: 游戏管理。   C#程序员整理的Unity 3D笔记(十二):Unity3D之单体模式实现GameManager

  • SaveManager: 配置管理。

  • 实现 Resume,功能玩到一半数据临时存储。 推荐 SaveManager 插件。可以 Load、Save 均采用二进制(快!!!) 所有 C# 类型都可以做 Serialize。 数据混淆,截屏操作。 MenuManager 菜单管理。

4.将 View 和 Model 之间增加一个媒介层。

MVCS:Strange IOC 插件。

MVVM:uFrame 插件。

5. ECS(Entity Component Based System)

Unity 是基于 ECS,比较适合 GamePlay 模块使用。 还有比较有名的 Entitas-CSharp

此篇的内容就这些。

更多内容

Unity 游戏框架搭建 (一) 概述的更多相关文章

  1. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

    约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...

  2. Unity 游戏框架搭建 (十六) v0.0.1 架构调整

    背景: 前段时间用Xamarin.OSX开发一些工具,遇到了两个问题. QFramework的大部分的类耦合了Unity的API,这样导致不能在其他CLR平台使用QFramework. QFramew ...

  3. Unity 游戏框架搭建 (十三) 无需继承的单例的模板

    之前的文章中介绍的Unity 游戏框架搭建 (二) 单例的模板和Unity 游戏框架搭建 (三) MonoBehaviour单例的模板有一些问题. 存在的问题: 只要继承了单例的模板就无法再继承其他的 ...

  4. Unity 游戏框架搭建 (十) QFramework v0.0.2小结

    从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...

  5. Unity 游戏框架搭建 (十七) 静态扩展GameObject实现链式编程

    本篇本来是作为原来 优雅的QChain的第一篇的内容,但是QChain流产了,所以收录到了游戏框架搭建系列.本篇介绍如何实现GameObject的链式编程. 链式编程的实现技术之一是C#的静态扩展.静 ...

  6. Unity 游戏框架搭建 (三) MonoBehaviour单例的模板

      上一篇文章讲述了如何设计C#单例的模板.也随之抛出了问题: 如何设计接收MonoBehaviour生命周期的单例的模板? 如何设计? 先分析下需求:   1.约束脚本实例对象的个数.   2.约束 ...

  7. Unity 游戏框架搭建 (二) 单例的模板

      上一篇文章中说到的manager of managers,其中每个manager都是单例的实现,当然也可以使用静态类实现,但是相比于静态类的实现,单例的实现更为通用,可以适用大多数情况. 如何设计 ...

  8. Unity 游戏框架搭建 (四) 简易有限状态机

    为什么用有限状态机?   之前做过一款跑酷游戏,跑酷角色有很多状态:跑.跳.二段跳.死亡等等.一开始是使用if/switch来切换状态,但是每次角色添加一个状态(提前没规划好),所有状态处理相关的代码 ...

  9. Unity 游戏框架搭建 (五) 简易消息机制

    什么是消息机制? 23333333,让我先笑一会. 为什么用消息机制?   三个字,解!!!!耦!!!!合!!!!. 我的框架中的消息机制用例: 1.接收者 ``` using UnityEngine ...

随机推荐

  1. nodejs弯路-01之'express' 不是内部或外部命令

    最近正想用node+angular+mongodb来完成一个小项目,三样都算是从零开始学习吧. 一开始是想用express -e projectname去创建一个ejs模板的项目.(一两句话就可以把大 ...

  2. windows 上优雅的安装 node 和 npm

    windows 的一键安装包,应该是最简单的 node 安装方式. 其实很多软件,拷贝过来就可以运行,根本不需要所谓的"安装"过程. 新建一个目录专门了管理 node 和 npm  ...

  3. Configure Red Hat Enterprise Linux shared disk cluster for SQL Server——RHEL上的“类”SQL Server Cluster功能

    下面一步一步介绍一下如何在Red Hat Enterprise Linux系统上为SQL Server配置共享磁盘集群(Shared Disk Cluster)及其相关使用(仅供测试学习之用,基础篇) ...

  4. 用java读写ini配置文件

    本文转载地址:       http://www.blogjava.net/silvernapoleon/archive/2006/08/07/62222.html import java.io.Bu ...

  5. 前端工程之node基础

    Node.exe是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Nodejs定义了一个构造函数 Module,所有的模块(Node中一个文件即一个模块)都是 Module 的 ...

  6. java虚拟机学习-JVM调优总结-调优方法(12)

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  7. 初识Vue.js

    一 ,什么是Vue.js? vue.js是一套构建用户界面的渐进式框架,它采用自底向上增量开发的设计.(自底向上设计方法是根据系统功能要求,从具体的器件.逻辑部件或者相似系统开始,凭借设计者熟练的技巧 ...

  8. iOS 开发之 protocol Buffer 数据交换

    前言: 从 14 年公司做项目时开始接触 Google 的 protocol Buffer,用了一段时间,后来到新公司就没有机会再使用了,趁着还没完全忘记,记录下. 简介:protocolbuffer ...

  9. 读 Zepto 源码之集合元素查找

    这篇依然是跟 dom 相关的方法,侧重点是跟集合元素查找相关的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zept ...

  10. Mac苹果系统 多系统启动:The rEFInd Boot Manager

    苹果系统 多系统启动 下载安装REFIT: 首先安装一下:REFIT, 在这个页面下载: http://refit.sourceforge.net/#download 选择mac disk image ...