Unity:列表变量数组。如何在 C# 中正确声明它

Posted

技术标签:

【中文标题】Unity:列表变量数组。如何在 C# 中正确声明它【英文标题】:Unity: Array of Lists variable. How to declare it correctly in C# 【发布时间】:2021-12-20 06:26:14 【问题描述】:

我需要在 Unity 中声明一个列表数组变量。数组大小是固定的,它是 5。我的代码按我的意愿工作,但我认为必须有更好、更短的方法来做到这一点:

public List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[] new List<GameObject>(), new List<GameObject>(), new List<GameObject>(), new List<GameObject>(), new List<GameObject>() ;

我试着这样做:

public List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[5];

但我有一个错误:对象引用未设置为对象的实例。

有什么方法可以更简单地声明我的变量吗?我的意思是如果我的阵列只有 5 个插槽就可以了,但如果是 100 个呢?在声明中复制 new List... 100 次有点愚蠢。

【问题讨论】:

您可以使用目标类型。 #9?功能例如。 sharplab.io/… - docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 任何东西的数组。您声明数组并制作正确大小的数组之一。然后,如果它具有基于类的对象,则需要用新创建的类对象填充数组。循环通常是最简单的设置方法 @Jim Hopper - 您可以接受适合您解决方案的答案 为什么不使用循环? 基本上这是 What is a NullReferenceException and how do I fix it 的副本,因为您创建了一个数组但没有初始化列表实例 【参考方案1】:

试试这个

var  arraySize=6; //or what size you need

List<GameObject>[] charactersOnBoardSortedP1 = new List<GameObject>[arraySize];

charactersOnBoardSortedP1=  charactersOnBoardSortedP1
                           .Select(obsp => obsp = new List<GameObject>()) 
                            .ToArray();

或者如果您需要同时启动更多的东西

for (var i=0; i<  charactersOnBoardSortedP1.Length; i++)

    charactersOnBoardSortedP1[i]=new List<GameObject>();
    // if you need to add some elements in the same time
    charactersOnBoardSortedP1[i].Add(new GameObject Id=i);

【讨论】:

请记住,new GameObject 会在场景中生成一个新对象,这可能不是 OP 真正想要做的!我认为 OP 只希望创建列表实例,但其中没有任何元素;) @derHugo 谢谢,正如您所见,我有 2 个变体 - 一个带有空列表,另一个变体仅显示了在需要时将一些对象添加到列表中的最舒适(恕我直言)方式。 只是想提一下,因为似乎不是每个人都知道GameObject 是如何工作的;)在第一个代码 sn-p 中,new List&lt;GameObject&gt;[arraySize]; 是完全多余的,尽管后来你还是通过 Linq 覆盖了它跨度> 【参考方案2】:

最简单的实现方法如下:

int arraySize = 5;
List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Repeat(new List<GameObject>(), arraySize).ToArray();

这将创建以空List&lt;GameObject&gt;()填充的指定大小的数组

如果你希望列表中有GameObject,你可以稍微修改一下上面的代码。

int arraySize = 5;
List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Repeat(new List<GameObject>  new GameObject(), arraySize).ToArray();

【讨论】:

请记住,new GameObject 会在场景中生成一个新对象,这可能不是 OP 真正想要做的!我认为 OP 只希望创建列表实例,但其中没有任何元素;) @derHugo 我也提到了解决方案。【参考方案3】:

试试这个。 Test here

创建一个列表变量数组。 将每个 Array 项初始化为一个新的 GameObject 列表。 然后您可以添加到所述数组的列表中。

using System;
using System.Text;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
                    
public class Program

    public static void Main()
    
        // create array of lists
        List<GameObject>[] COBSP1 = new List<GameObject>[5]; //charactersOnBoardSortedP1
        // setup lists
        COBSP1[0] = new List<GameObject>();
        COBSP1[1] = new List<GameObject>();
        COBSP1[2] = new List<GameObject>();
        COBSP1[3] = new List<GameObject>();
        COBSP1[4] = new List<GameObject>();
        
        // add objects to said list
        COBSP1[0].Add(new GameObject());
        COBSP1[0].Add(new GameObject());
        COBSP1[0].Add(new GameObject());
        COBSP1[0].Add(new GameObject());
        
        COBSP1[1].Add(new GameObject());
        COBSP1[1].Add(new GameObject());
        COBSP1[1].Add(new GameObject());
        COBSP1[1].Add(new GameObject());
        
        COBSP1[2].Add(new GameObject());
        COBSP1[2].Add(new GameObject());
        COBSP1[2].Add(new GameObject());
        COBSP1[2].Add(new GameObject());
        
        COBSP1[3].Add(new GameObject());
        COBSP1[3].Add(new GameObject());
        COBSP1[3].Add(new GameObject());
        COBSP1[3].Add(new GameObject());
        
        COBSP1[4].Add(new GameObject());
        COBSP1[4].Add(new GameObject());
        COBSP1[4].Add(new GameObject());
        COBSP1[4].Add(new GameObject());
    
    

【讨论】:

如果您的 COBSP1 数组包含大量值,则可以使用 for 循环。 请记住,new GameObject 会在场景中生成一个新对象,这可能不是 OP 真正想要做的!我认为 OP 只希望创建列表实例,但其中没有任何元素;) @derHugo COBSP1[4].Add(new GameObject()); 是示例代码,重新正确

以上是关于Unity:列表变量数组。如何在 C# 中正确声明它的主要内容,如果未能解决你的问题,请参考以下文章

unity的C#学习——不安全代码(声明不安全代码块:实现C/C++指针的创建与相关操作)

在 Unity C# 中实例化游戏对象列表

在 C# 中,有没有办法使 2 元素浮点数组等于 Unity Vector2 变量

编写一个程序,声明两个3行4列的二维数组,将其中一个数组初始化,再将此数组复制到另一个数组,最后分别

C# + Unity - 从类列表中的变量中获取最小值[重复]

如何在 C# 1.1 中动态声明和处理列表列表