月度存档: 八月 2011 - 第2页

unity3d awake与start的区别

awake与start的共同点是都只会被调用一次。

awake调用在start之前,所有game object初始化完成后,调用awake,调用顺序是随机的。

所以awake的作用是设置game object之间的关联。

unity3d js优化

1、unity3d中,变量应该使用静态类型,避免使用动态类型,这一点可以提供20倍的效率。

2、为了避免开发人员一不小心使用动态类型,unity3d中提供#pragma strict,用来强制使用静态类型,当使用动态类型时会提供编译错误。

3、缓存已经查找的组件:

例:下面一段代码很普通。

function Update () {
transform.Translate(0, 0, 5);
}

实际上修改一下,可以更高效:

private var myTransform : Transform;
function Awake () {
myTransform = transform;
}

function Update () {
myTransform.Translate(0, 0, 5);
}

这种改动,能压榨出最后一点性能。但这种改动,有时候并不能取到非常明显的效果。这种优化可取也可不取。

4、使用固定长度的数组。

unity3d中arrayList及array拥有可变长度特性,这种特性在游戏中并不是很合适。

unity3d中推荐使用固定长度集合,在开发中基本可以推算出所需要的最大长度。指定长度后,遍历的速度基本是线性的。

5、避免执行不必要的操作。

简单来说,就是如果一个对象,已经不在可视范围之内,附加在该对象上的代码完成没有必要执行。

unity3d提供了3种方式

1)使用OnBecomeVisible()及OnBecomeUnvisible()

function OnBecameVisible () {
enabled = true;
}

function OnBecameInvisible () {
enabled = false;
}

这种方式的缺点是,在某些情况,当对象从屏幕上不可见之后,依旧希望AI继续执行。

2) 使用OnTriggerEnter() 及OnTriggerExit()

function OnTriggerEnter (c : Collider) {
if (c.CompareTag(“Player”))
enabled = true;
}

function OnTriggerExit (c : Collider) {
if (c.CompareTag(“Player”))
enabled = false;
}

这种方式就比较合适一些,当玩家靠近时,才开始进行计算,当玩家远离后,就不会再被执行。

3) 这种就简单了,使用 yield 每次暂停5秒。

 

unity3d daltaTime

Time.deltaTime是上一次frame完成需要的时间。

也即每次调用时间隔的时间。因为每frame都会被调用一次。