unity3d 之 在Unity3D中使用静态变量

下面的示例解释了为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中使用静态变量?

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值