`

在Unity3D中使用静态变量

阅读更多

下面的示例解释了为Unity3D引擎编写脚本的时候如何来使用静态变量.本文示例的脚本使用C#编写,同样的适用于javascript。

 在深入主题之前,必须要清楚地是我们应该尽量避免使用静态变量,有大量的缘由可以很容易在

网上找到.大部分时候使用单例更好。了解了上面的东西之后,这里有一个对静态变量的简单定义:

它们是属于类的变量,不属于对象或类创建。这意味着静态变量始终保持同样的值,不论给定类的对象是什么

另外一个特征是:只要类处于内存中,它们仍是有效的引用。静态变量在类创建之前由编译器初始化,先于其他变量

或方法.但是这对于Unity3D来说又意味这什么呢?

这意味着不需要产生一个类对象来读或者写一个变量值,所以只需要一次性获取游戏对象或组件。

下面是一个示例:有50个敌人对象在一个unity3D场景中,它们都绑定了AI脚本并且需要主角的Transform

来正确的工作,那么在每个敌人的Awake()函数中如果不使用静态变量的话应该是:

 

[csharp] view plaincopy
 
  1. public class EnemyBehaviour:MonoBehaviour  
  2. {  
  3.     private Transform playerTransform;  
  4.     void Awake()  
  5.     {  
  6.         playerTransform = GameObject.FindWithTag("Player").GetComponent<Transform>();  
  7.   
  8.     }  
  9.   
  10.     void Update()  
  11.     {  
  12.         // Do Something Based On The Player's Position  
  13.         if(playerTransform.position.x>100)  
  14.         {  
  15.             // Do Something   
  16.         }  
  17.     }  
  18. }  


利用静态变量来做同样的事情,应该创建一个称为GameController的脚本。它可以一次性获得主角的Transfrom然后将它存入静态变量:

[csharp] view plaincopy
 
  1. public class GameController:MonoBehaviour  
  2. {  
  3.     public static Transform playerTransform;  
  4.       
  5.     void Awake()  
  6.     {  
  7.         playerTransform = GameObject.FindWithTag("Player").GetComponent<Transform>();  
  8.     }  
  9. }  


 

接下来,无论何时敌人的AI脚本需要知道主角的位置,只需要调用静态变量:

[csharp] view plaincopy
 
  1. public class EnemyBehaviour:MonoBehaviour  
  2. {  
  3.     void Update()  
  4.     {  
  5.         // Acessing The Static Variable  
  6.         if(GameController.playerTransform.position.x > 100)  
  7.         {  
  8.             // Do Something  
  9.         }  
  10.     }  
  11. }  


 

注意到在第二个例子中,我们只需要调用一次Awake()方法来获得主角对象的Transform引用。然而在第一个例子中则需要

在每个敌人调用一次Awake()方法,这样就调用了50次该方法。 所以即使在场景中有50个敌人依然只需要调用一次的Awake

方法,应为其他脚本可以直接调用GameController暴露的静态变量。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics