【问题标题】:Array Losing Initialization on Awake阵列在唤醒时丢失初始化
【发布时间】:2017-06-10 16:58:30
【问题描述】:

我正在我的 SaveData 类中初始化两个不同的布尔数组。当调用 Awake 函数时,其中只有一个保持初始化状态。通过这个,我的意思是它保留了它的长度 17 而另一个失去了它的长度 11 并且突然变成了 0 的长度。除了长度之外的唯一区别是,一个有效的是从本地枚举中导出它的长度,而另一个正在从另一个类枚举中得出其长度。我可以在初始化行放一个断点,它会证明它首先初始化为11的长度(即枚举值是好的)。然而,当我到达 Awake 函数时,它神奇地回到了 0,而另一个数组仍然是 17。这是什么原因?

更新: Unity 中一定有 bug。我只是在工作数组的末尾添加了一个字母,任何人都没有使用它,这可以从名称更改中没有错误得到证明,突然之间,它现在也被减小到 0 的大小。所以......现在呢?

简化代码:

[System.Serializable]
public class SaveData : MonoBehaviour {
    public static SaveData saveData;

    public bool[] dumbArray = new bool[(int)ExternalClass.ExternalEnum.LengthViaLastElement]; // 11
    public bool[] goodArray = new bool[(int)LocalEnum.LengthViaLastElement]; // 17

    ...

    public void Awake()
    {
        foreach (bool i in goodArray) Debug.Log(i); // prints 0 to 16
        foreach (bool i in dumbArray) Debug.Log(i); // prints nothing
        if (saveData == null) saveData = this;
    }
}

【问题讨论】:

  • 是持续行为还是随机发生?如果问题持续存在,我怀疑数组分配可能在您的代码中的某处出错。在调用 Awake(...) 函数之前将代码发布到您正在触摸的 dumbArray 和 goodArray。
  • 这很奇怪,在叫醒之前我不会碰它们。但这是一个长期存在的问题。

标签: c# arrays unity3d initialization


【解决方案1】:

终于!这个问题与检查员有关。我的脚本被附加到一个对象,它似乎并不关心初始化大小,除非您第一次将代码附加到该对象。所以不起作用的数组是我在附加脚本后添加的一个新数组,当我将脚本附加到对象时,起作用的数组已经在代码中。对象实例将采用新变量的默认值,但显然不是新数组的默认数组大小。太可怕了……

解决方案:在 Awake/Start 中初始化数组。当然,这意味着检查员将无法控制它们,这在某些情况下可能很糟糕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多