Unity中的C#使用优化

避免装箱拆箱

所谓装箱就是把值类型变成引用类型,比较隐蔽的情况是:把值类型作为Object类型参数的时候,或者返回一个object对象的时候。

第一种:

1
Debug.Log(string.Format("content: {0}", 1));

非装箱版本:

1
Debug.Log(string.Format("content: {0}", 1.ToString()));

第二种。众所周知,协程IEnumerator返回的类型是object。当我们想跳过当前帧的时候有三种方式:

1
2
3
yield return null;
yield return 0;
yield return new WaitForFrame();

在这上面三种方法中,第一种为最佳。这是因为第二种需要把0装箱成一个Object,而第三种则需要new一个新对象。如果这个协程经常被调用(每帧),应该选择返回null。

避免高消耗API的频繁调用

包括:

  1. GameObject.GetComponent<T>
  2. GameObject.transform GameObject.rigidBody
  3. UnityEngine.Object == null 可以使用Assert来代替

提取常用的局部变量为成员变量

反例

1
2
3
4
5
6
7
8
9
10
class Test : MonoBehaviour
{
IEnumerator Co_Test()
{
while(true)
{
yield return new WaitForEndOfFrame();
}
}
}

改进

1
2
3
4
5
6
7
8
9
10
11
12
class Test : MonoBehaviour
{
private WaitForEndOfFrame _waitForEndOfFrame = new WaitForEndOfFrame();

IEnumerator Co_Test()
{
while(true)
{
yield return _waitForEndOfFrame;
}
}
}

提取常使用的不变对象为静态常量

假设我们每帧需要对画笔对象设置颜色,而当前情况中需要每帧都设置为白色,比较高消耗的写法为:

1
2
3
4
void Update()
{
_painter.color = new Color(1f, 1f, 1f, 1f);
}

改进的情况下,我们新建一个PaintColor的类,设置好几种颜色,外面直接用,不需要每次都new。

1
2
3
4
5
6
7
8
9
10
11
12
public class PaintColor
{
public static readonly Color WHITE = new Color(1f, 1f, 1f, 1f);
}

public MyClass : MonoBehaviour
{
void Update
{
_painter.color = PaintColor.WHITE;
}
}

同理,应当多多使用unity提供给我们的静态常量如Vector.zero,而尽量避免自己new一个Vector(0,0,0)。

string操作

避免使用string +操作,多多使用string.format和StringBuilder.Append()。

Buy Me A Coffee / 捐一杯咖啡的钱
分享这篇文章~
0%
//