[Unity-19] Unity中全局变量的赋值过程

使用Unity开发的朋友可能会遇到这样一个问题,那就是我在脚本中定义了一个公共全局变量并且赋值,但是运行后发现这个变量并不是这个值,这里就给大家解释一下原因。

代码如下:

public class Test : MonoBehaviour {

    public int a = 10;
    void Awake()
    {
        a = 20;
    }
    void Start () {
        a = 30;
	}
}
由于是public类型,所以变量a会在Unity面板中显示出来,如下图:



那么这个变量a的赋值顺序是怎样的呢?

1.首先a的值是定义时赋的值10。

2.然后a的值被Unity面板中的15替换。

3.然后a的值被Awake中的20替换。

4.然后a的值被Start中的30替换。


看到这个结果相信大家都知道原因了,要初始化的公共变量最好放到start中,而不要相信定义时的效果。当然你也可以使用[HideInInspector]让变量不显示在Unity面板中。


Unity,一个脚本的数据通常作为公共变量、属性或者是通过组件传递给其他脚本。如果你想要让一个脚本A的数据成为脚本B的变量,你可以采用以下几种方式: 1. **全局变量**:如果数据在整个场景都需要访问,可以定义为`static`的`public`变量,然后在其他脚本直接引用它。 ```csharp public class ScriptA : MonoBehaviour { public static float mySharedData; } ``` 2. **组件字段**:如果数据只对特定型的对象有用,可以在包含该数据的脚本上添加公共字段,然后在需要的地方实例化这个组件。 ```csharp public class ScriptA : MonoBehaviour { public DataComponent dataComponent; } public class DataComponent : MonoBehaviour { public float customData; } ``` 在`ScriptB`,可通过`dataComponent.customData`访问`ScriptA`的数据。 3. **事件系统**:如果数据变化会影响其他脚本的行为,可以使用Unity的事件系统,比如`UnityEvent`或`CustomEvent`。 4. **共享单例**:如果数据在整个游戏生命周期内只需管理一次,可以创建一个单例脚本来存储数据,其他脚本通过`FindObjectOfType<T>()`获取。 5. **序列化字段**:对于需要持久化的数据,可以将其放在`ScriptableObject`,然后在其他脚本里通过名称查找并赋值。 无论哪种方式,记得在使用前检查是否已初始化,并处理可能出现的并发访问问题。同时,良好的设计原则是尽量减少跨脚本之间的直接耦合,保持代码结构清晰。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值