Unity-设计模式

组合模式·

组合模式是为了在项目提高代码复用性,降低增加对象成本的设计模式。

简单来说,就是将每个功能单独分为一个脚本上使用,然后根据需要挂载到游戏对象上。

在 Unity 中,脚本继承了 MonoBehaviour 类,就会被视为一个脚本组件,如:public class GameManager : MonoBehaviour ,然后根据需要,将脚本组件添加到游戏对象上。

脚本通讯·

1
2
var xxxx = GetComponent<Walk>();
xxxx.walk();

GetComponent()的性能问题·

  1. 避免在 Update 中来使用 GetComponent,否则性能代价过于昂贵。
  2. 若多处地方使用 GetComponent,尝试初始化获得组件的引用,避免反复获取。

单例模式·

单例模式是最常用的设计模式之一,原因是因为其存在着方便快捷的好处,但同时也会带来耦合度高扩展困难的问题。

优点:

  • 节约内存
    只存在一个对象进行运作
  • 节省性能
    只会在第一次请求时被创建,不用频繁经历被引用对象的创建和销毁
  • 使用方便
    可以轻松地链接游戏各个模块

缺点:

  • 代码耦合度加大,维护困难
    滥用单例中的对象,修改对象时牵扯到的脚本数量难以计量
  • 代码更新和扩展困难
    对单例中的对象,动一发则牵全身。

单例模式的两种写法·

第一种强调的是,除非 Instance 为空,才赋值;否则都自毁。

1
2
3
4
5
6
7
8
9
10
11
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(this);
}
}

第二种强调的是,只有 Instance 不为空且不等于自己,才自毁;否则都更换新的指向对象。(重新赋值的几率更大)

1
2
3
4
5
6
7
8
9
10
11
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this);
}
else
{
Instance = this;
}
}

用例:Unity-实现功能 # 1.2 GameManager - 游戏管理器

命令模式·

通过命令模式可以简单的实现解耦,撤销功能,以及对象的可参数化。

观察者模式·

通过委托和事件,将一个批量处理的操作,转换成事件的添加与执行。

  • 处理一个信息对应多个事件发生的情况

  • 使用更少的代码

  • 更加易于维护

对象池模式·

对象池模式可以大幅度减少游戏的性能开销,适用于高重复创建销毁物体的情况