unity3d 游戏对象删除 该对象绑定的unity脚本执行顺序里面的静态变量会置空吗

7702人阅读
下面的示例解释了为Unity3D引擎编写脚本的时候如何来使用静态变量.本文示例的脚本使用C#编写,同样的适用于javascript。
&在深入主题之前,必须要清楚地是我们应该尽量避免使用静态变量,有大量的缘由可以很容易在
网上找到.大部分时候使用单例更好。了解了上面的东西之后,这里有一个对静态变量的简单定义:
它们是属于类的变量,不属于对象或类创建。这意味着静态变量始终保持同样的值,不论给定类的对象是什么
另外一个特征是:只要类处于内存中,它们仍是有效的引用。静态变量在类创建之前由编译器初始化,先于其他变量
或方法.但是这对于Unity3D来说又意味这什么呢?
这意味着不需要产生一个类对象来读或者写一个变量值,所以只需要一次性获取游戏对象或组件。
下面是一个示例:有50个敌人对象在一个unity3D场景中,它们都绑定了AI脚本并且需要主角的Transform
来正确的工作,那么在每个敌人的Awake()函数中如果不使用静态变量的话应该是:
public class EnemyBehaviour:MonoBehaviour
private Transform playerT
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 playerT
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中使用静态变量?
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23289次
排名:千里之外
原创:16篇
转载:16篇
(2)(1)(2)(11)(1)(1)(10)(9) 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
Unity3D占用内存太大的解决方法
下载积分:840
内容提示:Unity3D占用内存太大的解决方法
文档格式:PDF|
浏览次数:441|
上传日期: 16:37:59|
文档星级:
该用户还上传了这些文档
Unity3D占用内存太大的解决方法
官方公共微信推荐这篇日记的豆列
······【转】[脚本]单利模式的实现 - unity3d的日志,人人网,unity3d的公共主页
哈尔滨 UNITY3D交流爱好者群
【转】[脚本]单利模式的实现
&在游戏编程中常常遇到这样的问题,以unity3d为例,譬如场景中只有一个的物体:主角,用做得分显示的UI。要随时获取这些对象不可能每次调用的时候使用类似unity中&Find&函数,这样做低效率;建一个公共类添加一个公有静态变量来保存这些对象也可以,可是如果随着这些对象的增多维护起来困难且耦合度高不利团队开发,不怎么地道。我们想要的是这样:用到它时可以立即访问到它不需要查找,这个对象与其他对象不相关不需要在其他地方建立索引来使用&&。单例模式就是做这个。&
&&&&单利模式实用意义就是客户代码可以随时访问而无需进行实例化查找等操作。模式中重点就是怎样维持/获取这个唯一的对象;通俗点就是怎样使用&类名.方法名&的形式访问而不是&实例名.方法名&的形式访问,要点就是在类的内部实例化自己/返回自己的实例。
&&&&使用&类名.方法名&访问形式大家知道的C#能做到这样的是公有静态成员,包括:公有静态变量,公有静态属性,公有静态函数。下面就是这几种情况下的实现方式。
方法一&&:公有静态成员变量,在Awake函数中以赋值
代码如下:
public class ClassA : MonoBehaviour
&&&&public static ClassA
&&&&void Awake()
&&&&&&&&//if (instance != null) //判断是否已赋值
&&&&&&&&//{
&&&&&&&&&&&&instance =
&&&&&&&&//}
使用:ClassA.instance.XXX() ; ( XXX()表示方法 )
&&&&&&&&&&&& ClassA 在Awake()调用的时候才给instance 赋值,即在其他脚本的Awake()之前或者之中ClassA 并不能保证instance 不为null。所以此种方法调用的时候必须保证ClassA 的 Awake()函数调用之后。
方法二&&:公有静态属性,属性get()中完成赋值
代码如下:
public class ClassA : MonoBehaviour
&&&&public static ClassA _
阅读(923)|
人人移动客户端下载

我要回帖

更多关于 unity 脚本创建对象 的文章

 

随机推荐