下面的示例解释了为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中,你可以使用`static`关键字来定义一个静态变量,就像在C#中一样。例如,在text1.js中,我们可以这样声明一个静态布尔变量: ```javascript static var flag : boolean = false; ``` 这里的`flag`就是...
在 Unity3D 中,可以使用材质(Material)来实现动画贴图。 在上面的代码中,我们可以看到 AnimatedUVs 脚本,它继承自 MonoBehaviour 类。这个脚本的主要功能是实现动画贴图的UV坐标的动画效果。 在 LateUpdate()...
在Unity3D中,使用JS(UnityScript)编写脚本时,理解和正确地使用静态与非静态成员对于实现游戏逻辑的效率和灵活性至关重要。静态变量在多物体交互、全局状态管理以及简化对象间通信等方面都有广泛的应用。理解这些...
在Unity3D中,使用C#语言编写脚本,定义常量时需要使用`const`关键字。例如: ```csharp const int MAX_HEALTH = 100; ``` 在这个例子中,`MAX_HEALTH`是一个整型常量,表示最大生命值,它的值在程序执行过程中不...
在Unity3D中连接数据库是游戏开发中常见的一项任务,尤其是在需要实时数据交换或持久化存储的情况下。本文将深入解析如何在Unity3D环境中利用C#语言与MySQL数据库进行交互,包括连接、查询以及基本的数据操作。 ###...
在这个问题中,我们关注的是如何通过C#脚本来实现这种跨场景的数据传递,特别是使用公共静态变量的方法。 首先,我们要理解什么是静态变量。在C#中,`static`关键字用于声明一个类成员,它不属于类的任何实例,而是...
访问 GameObject 和组件方面,在 JavaScript 中,可以使用 `GameObject.Find` 静态方法来获取 GameObject,而在 C# 中,可以使用 `GameObject.Find` 方法或 `GetComponent` 方法来获取组件。 JavaScript 和 C# 都有...
总结一下,Unity3D游戏开发中防止脚本重复实例化的关键在于使用静态变量跟踪实例化状态,并结合`Instantiate()`和`DontDestroyOnLoad()`函数来控制对象的创建和生命周期。通过这样的方式,我们可以确保重要的游戏...
1. `static` 静态类和静态变量:它们在整个游戏过程中都不会被重新加载,因此可以作为全局变量使用,特别适合存储场景数组。 2. `Collider` 的 `Is Trigger` 属性:设置为 `True` 后,物体可以穿越而不产生碰撞效果...
这篇笔记主要涉及了在Unity3D中使用JavaScript进行脚本编写的一些基础概念和关键知识点。 首先,我们来看变量的声明。在Unity3D的JavaScript中,变量的声明通常以`var`开头,接着是变量名,然后是类型声明。例如: ...
在Unity3D中,脚本是控制游戏对象行为、实现交互逻辑和游戏规则的核心工具。本“Unity3D脚本手册中文完整版”为开发者提供了详尽的中文参考,旨在帮助那些英语不熟练的朋友们更好地理解和应用Unity3D脚本。 手册...
在场景切换过程中,有时需要传递数据,Unity3D提供了各种方式,如Singleton模式、静态变量、PlayerPrefs或使用GameController类来保存和传递数据。 总之,Unity3D的场景打包与加载涉及到游戏性能、用户体验和资源...
在Unity中,`Application.dataPath`是一个内置的静态变量,它表示当前Unity运行时的游戏数据目录。这个目录在编辑器中通常是项目的`Assets`文件夹,但在构建后的游戏中会指向游戏安装目录下的`Resources`或`...
在Unity3D中,Lightmapping可以提供高质量的静态光照效果,但通常不适用于动态光照或需要实时变化的场景元素。 首先,我们要理解Lightmap的制作流程。在Unity中,当场景设置好光源和静态物体后,通过烘焙(Bake)过程...
在 Unity3D 中,GUI 编程是通过 OnGUI() 函数实现的,该函数是一个特殊的函数, Unity3D 引擎会在每帧更新时调用该函数,以便在屏幕上绘制 GUI 元素。在 OnGUI() 函数中,我们可以使用 GUI 类的静态方法来绘制各种 ...
Unity3D网络系统基于客户端-服务器(Client-Server)架构,这种架构在网络游戏开发中广泛使用,确保了数据的安全性和同步性。在Unity中,服务器负责处理游戏逻辑和状态管理,而客户端则负责用户界面和本地输入处理。...
在Unity3d开发过程中,有一套成熟的代码库是至关重要的,可以大大提高开发效率和代码质量。"unity3d 常用代码库"包含了大量预设的、经过验证的代码片段,覆盖了各种常见功能和模块,为开发者提供了一个方便的工具集...
在Unity3D开发过程中,为了增强游戏视觉体验,开发者经常会使用各种特效来实现画面的过渡与切换。其中,“Unity3D 画面扭曲切换效果脚本”提供了一种通过扭曲效果来实现两个场景之间平滑过渡的方法。该脚本名为`...
在Unity3D开发过程中,脚本是实现逻辑和交互的关键组成部分。通过编写脚本,开发者可以控制游戏对象的行为,实现复杂的功能。 ##### 常用操作 Unity3D支持多种语言进行脚本编写,其中最常用的是C#。C#提供了丰富的...