为了重构手头的一款项目,翻出来当时未接触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:

 // 存储动可服用的GameObject。
private List<GameObject> dormantObjects = new List<GameObject>();
// 在dormantObjects获取与go类型相同的GameObject,如果没有则new一个。
public GameObject Spawn(GameObject go)
{
GameObject temp = null;
if (dormantObjects.Count > 0)
{
foreach (GameObject dob in dormantObjects)
{
if (dob.name == go.name)
{
// Find an available GameObject
temp = dob;
dormantObjects.Remove(temp);
return temp;
}
}
}
// Now Instantiate a new GameObject.
temp = GameObject.Instantialte(go) as GameObject;
temp.name = go.name;
return temp;
} // 将用完的GameObject放入dormantObjects中
public void Despawn(GameObject go)
{
go.transform.parent = PoolManager.transform;
go.SetActive(false);
dormantObject.Add(go);
Trim();
} //FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。
public void Trim()
{
while (dormantObjects.Count > Capacity)
{
GameObject dob = dormantObjects[0];
dormantObjects.RemoveAt(0);
Destroy(dob);
}
}

缺点:

  • 不能管理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. Ionic集成ArcGIS JavaScript API.md

    1. Ionic同原生ArcGIS JavaScript API结合 1.1. 安装esri-loader 在工程目录下命令行安装: npm install angular2-esri-loader ...

  2. 基于python的爬虫(一)

    抓取网页 python核心库 urllib2 实现对静态网页的抓取,不得不说,"人生苦短,我用python"这句话还是有道理的,要是用java来写,这估计得20行代码 (对不住了博 ...

  3. How to change current process to background process

    Situation: there is a script or command is running, but we need to close current box/windows to do o ...

  4. c# mvc如何生成excel

    我们知道mvc可以通过js生成excel文件,同样在后台c#中一样可以生成excel文件. 首先我们要在后台中写如下方法: [HttpGet]public FileResult excel_gener ...

  5. textView布局的一点体会

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. [原创]MongoDB综合实例一

    CentOS-6.5单机实现mongoDB分片 环境:1)CentOS 6.5系统      2)IP:本机3)MongoDB:MongoDB-linux-x86_64-2.6.1 实现:两个副本集s ...

  7. qrcode生成二维码插件

    今天我要和大家分享的是利用qrcode来生成二维码. 首先要使用qrcode就需要引用文件,我这边用的是1.7.2版本的jquery加上qrcode <script type="tex ...

  8. GPU编程-Thread Hierarchy(3)

    1. 如果处理的数据是二维的或者三维的,应该怎么办呢? 针对的,我们可以按照二维或者三维的方式,组织线程.老规矩,先代码.后解释 // Kernel definition __global__ voi ...

  9. day_ha配置文件

    流程图: 代码 #!/sur/bin/env python # -*- coding: utf-8 -*- #{"backend": "www.oldboy.org&qu ...

  10. java数据结构(二叉树)

    Node节点: public class Node { public long data; public String sData; public Node leftChild; public Nod ...