下面的示例解释了为Unity3D引擎编写脚本的时候如何来使用静态变量.本文示例的脚本使用C#编写,同样的适用于javascript。
在深入主题之前,必须要清楚地是我们应该尽量避免使用静态变量,有大量的缘由可以很容易在
网上找到.大部分时候使用单例更好。了解了上面的东西之后,这里有一个对静态变量的简单定义:
它们是属于类的变量,不属于对象或类创建。这意味着静态变量始终保持同样的值,不论给定类的对象是什么
另外一个特征是:只要类处于内存中,它们仍是有效的引用。静态变量在类创建之前由编译器初始化,先于其他变量
或方法.但是这对于Unity3D来说又意味这什么呢?
这意味着不需要产生一个类对象来读或者写一个变量值,所以只需要一次性获取游戏对象或组件。
下面是一个示例:有50个敌人对象在一个unity3D场景中,它们都绑定了AI脚本并且需要主角的Transform
来正确的工作,那么在每个敌人的Awake()函数中如果不使用静态变量的话应该是:
public class EnemyBehaviour:MonoBehaviour
{
private Transform playerTransform;
void Awake()
{
playerTransform = GameObject.FindWithTag("Player").GetComponent<Transform>();
}
void Update()
{
// Do Something Based On The Player's Position
if(playerTransform.position.x>100)
{
// Do Something
}
}
}
利用静态变量来做同样的事情,应该创建一个称为GameController的脚本。它可以一次性获得主角的Transfrom然后将它存入静态变量:
public class GameController:MonoBehaviour
{
public static Transform playerTransform;
void Awake()
{
playerTransform = GameObject.FindWithTag("Player").GetComponent<Transform>();
}
}
接下来,无论何时敌人的AI脚本需要知道主角的位置,只需要调用静态变量:
public class EnemyBehaviour:MonoBehaviour
{
void Update()
{
// Acessing The Static Variable
if(GameController.playerTransform.position.x > 100)
{
// Do Something
}
}
}
注意到在第二个例子中,我们只需要调用一次Awake()方法来获得主角对象的Transform引用。然而在第一个例子中则需要
在每个敌人调用一次Awake()方法,这样就调用了50次该方法。 所以即使在场景中有50个敌人依然只需要调用一次的Awake
方法,应为其他脚本可以直接调用GameController暴露的静态变量。
何时应该在Unity3D中使用静态变量?