【问题标题】:Why do sometimes you have to create a new list and sometimes you don't in Unity?为什么有时你必须创建一个新列表,而有时你不需要在 Unity 中创建一个新列表?
【发布时间】:2019-03-15 22:38:45
【问题描述】:

所以我将一个项目升级为另一个。

在第一个项目中,预制件已经在场景中,我在上面手动设置了所有组件和脚本。

在第二个中,预制件是在运行时由脚本创建的,我必须通过脚本添加所有内容。

在我找到一个有公开列表的脚本之前,我并没有遇到太多麻烦。当代码运行时,每次调用列表时它都会给我一个空引用。

所以在挖掘和尝试和错误之后,我发现不是仅仅声明列表(公共列表等等;)我必须实例化它(公共列表 = 新列表)。

我很高兴找到了解决方案,但我不明白,这让我很烦恼。为什么我必须在第二个项目中创建一个新列表?

【问题讨论】:

  • 好的做法是不要依赖预制件的状态,而总是手动初始化。对我来说,我尝试在 Start() 方法中尽可能少地投入,我通常会编写一个 Initialize(...) 方法来设置预制件。这让您可以完全控制预制件的设置方式,但更重要的是,它们的设置顺序。

标签: list unity3d


【解决方案1】:

这是说你有图片(参考)或你在这个地方的区别,(实例)这样想。可以说这个列表不是一个列表,它只是一个 int。

我可以说 int i;

我有一个参考,但参考是空的,即它没有价值。

但是如果我说 int i = 0;

它现在具有价值,没有零我无法对i 采取行动,因为计算机不知道如何处理它......

基本上是说List<Item> list;

而不是列表列表 = new List<Item>()

表示您已经声明了该变量,并在内存中分配了空间,但它没有任何意义,直到您分配一个值。希望这会有所帮助。

您不能在 C# 中使用未初始化的变量。您可以使用其类型的默认值初始化变量。您还可以使用类型的默认值来指定方法的可选参数的默认值。

【讨论】:

  • int i; 工作得很好,因为它是一个值类型。它被自动分配一个默认值(0)。
  • Severity Code Description Project File Line Suppression State Error CS0165 Use of unassigned local variable 'i' 是吗?
  • docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 看看。是的,它有一个值,但除非分配它,否则它不会编译!
  • 仍然需要将其调用为默认值,即int a = default(int); 或默认文字int a = default;,但当int a = 0 输入较少时,这就过于复杂了
  • 提问者没有使用 local 变量。 a script which had a public list,脚本中的公共字段会在 Unity 的序列化过程中自动分配一个值。见沙波夫的回答。私有字段也被分配了默认值(并且只在编译时抛出一个警告)。 warning CS0649: Field 'Temp.i' is never assigned to, and will always have its default value '0'.
【解决方案2】:

当您在 Unity 编辑器中手动将脚本添加到游戏对象时,Unity 会将该公共列表初始化为一个空列表。然后它将序列化该空列表。当您实例化手动创建的预制件时,它已经包含编辑器序列化的空列表。

【讨论】:

  • 您通常可以说 Unity 编辑器自动初始化任何序列化字段。 public 属性会自动序列化,但这也适用于 [SerialzeField] private List<T> ,只要它在检查器中的某个地方使用。数组也一样。
  • 只是为了获得完整的信息:值类型字段(int、bool、string、float 等)总是使用默认值初始化,即使它们是私有的;)
【解决方案3】:

声明 List 意味着你创建的类有一个 List 但默认情况下它仍然没有值。为了使 List 可用,您必须通过分配 = new List<Data> 创建它的一个实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2021-02-11
    相关资源
    最近更新 更多