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<GameObject>[arraySize];
是完全多余的,尽管后来你还是通过 Linq 覆盖了它跨度>
【参考方案2】:
最简单的实现方法如下:
int arraySize = 5;
List<GameObject>[] charactersOnBoardSortedP1 = Enumerable.Repeat(new List<GameObject>(), arraySize).ToArray();
这将创建以空List<GameObject>()
填充的指定大小的数组
如果你希望列表中有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++指针的创建与相关操作)
在 C# 中,有没有办法使 2 元素浮点数组等于 Unity Vector2 变量
编写一个程序,声明两个3行4列的二维数组,将其中一个数组初始化,再将此数组复制到另一个数组,最后分别