孙广东 2015.12.21
当你建立Unity 的手机游戏你最可能渴望设置Script Call Optimization为Fast But No Exceptions,只要你相信你能做到。
Fast But No Exceptions是隐藏在Edit -> Project Settings -> Player menu (Other Settings/Optimization section)。通过选择此选项您的代码将会去除异常处理代码,而得到更好的性能。通过启用此选项 你将带着很大风险。从现在起,任何异常会使你的游戏立即崩溃,你甚至不知道原因是什么。
你可能想要启用 Fast But No Exceptions选项,只有当你确信你的游戏不会抛出一个单一的异常。此外,如果你不是唯一的人在该项目中工作,风险就更大。
不要假设任何事情
不要假设你的脚本设置正确。要做一个悲观主义者,无时无刻都在想的最坏的情况。让我们以这个脚本为例:
public class Plane : MonoBehaviour {
public Airport airport;
void Update() {
if (Vector3.Distance(airport.transform.position, transform.position) < 1000) {
Land();
}
}
// ...
}
这是一个非常基本的例子,关于如何与机场飞机进行交互。我想你已经知道要说什么。此代码如果没有Airport将会中断。这是,我们假设在场景工作的人会仔细,连接对象之间的所有引用的情况。但它不是那么容易,因为他们不连接的所有引用Unity不会给任何人的任何错误或警告,除非他们运行Scene,看到的异常。
好吧,我们试着让这个脚本更有自我意识。我们希望它有点毛病时发出声音。为了做到这一点,我将使用 MonoBehaviour.OnValidate() 消息。
OnValidate() 被调用的情形是:
• 在 编辑器不需要进入play 模式
• 任何脚本值更改时
• 场景scene 加载时
因此,该脚本可能现在看起来像这样:
public class Plane : MonoBehaviour {
public Airport airport;
void OnValidate() {
if (airport == null) {
Debug.LogError("Airport is set to null", this);
}
}
void Update() {
if (Vector3.Distance(airport.transform.position, transform.position) < 1000) {
Land();
}
}
// ...
}
这将打印错误消息到控制台,playing你的游戏在编辑器中,并在大多数情况下,这将是足够了。然而,你也可能想要在运行时 检查是否airport为 null (OnValidate()函数仅在编辑器中工作) 。
public class Plane : MonoBehaviour {
public Airport airport;
void OnValidate() {
CommonValidate();
}
void Update() {
CommonValidate();
if (Vector3.Distance(airport.transform.position, transform.position) < 1000) {
Land();
}