无法统一引用游戏对象的 2D 数组
Posted
技术标签:
【中文标题】无法统一引用游戏对象的 2D 数组【英文标题】:Unable to reference 2D array of game objects in unity 【发布时间】:2021-04-15 04:12:11 【问题描述】:我正在统一创建国际象棋,并且我想使用 2D 单元格数组创建棋盘。我能够创建一个片段数组,并可以在 Unity 中使用它们各自的预制件来引用它们。但我没有选择引用二维数组。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class gameManager : MonoBehaviour
public GameObject[,] cell = new GameObject[7,7];
public GameObject[] Wpawn = new GameObject[7];
public GameObject[] Bpawn = new GameObject[7];
public GameObject[] Wrook = new GameObject[1];
public GameObject[] *** = new GameObject[1];
public GameObject[] Wknight = new GameObject[1];
public GameObject[] Bknight = new GameObject[1];
public GameObject[] Wbishop = new GameObject[1];
public GameObject[] Bbishop = new GameObject[1];
public GameObject Wking;
public GameObject Bking;
public GameObject Wqueen;
public GameObject Bqueen;
bool[] Bpawn2 = new bool[7];
bool[] Wpawn2 = new bool[7];
short turn = 0;
// Start is called before the first frame update
void Start()
#region Board
for (float y = 0F; y <= 7; y+= 1)
for (float x = 0F; x <= 7F; x+= 1)
if (y % 2 == 0)
if (x % 2 == 0)
cell[(int)x,(int)y].GetComponent<SpriteRenderer>().color = Color.gray;
else if (x % 2 == 1)
cell[(int)x,(int)y].GetComponent<SpriteRenderer>().color = Color.white;
else if (y % 2 == 1)
if (x % 2 == 0)
cell[(int)x,(int)y].GetComponent<SpriteRenderer>().color = Color.white;
else if (x % 2 == 1)
cell[(int)x,(int)y].GetComponent<SpriteRenderer>().color = Color.gray;
Instantiate(cell[(int)x,(int)y], new Vector3(x - 3.5F, y -3.5F), transform.rotation);
#endregion
如您所见,我已正确初始化二维数组。我只给你展示了setboard Region,因为其余的都没有问题。
这是游戏管理器脚本组件以及它向我展示的内容。
没有引用 Cell Prefab 的选项
【问题讨论】:
因未表现出适当的研究努力而被否决。回答是因为这是一个有效的问题并且经常出现。 @HarshdeepSingh 我无法研究它,因为我不知道要使用什么关键字。每次我搜索它时,它都会向我展示一些不是我的问题的东西。我不知道序列化。感谢您的解释。 【参考方案1】:TL;DR
默认 Inspector 只能显示可由 Unity 的 Serializer 序列化的变量,即 Unity 可以出于保存/加载目的写入和读取文件的文件。二维数组不可序列化,因此它们在 Inspector 中不可见。
请熟悉 Unity 中的Serialization 规则。这是关于what Serialization is.的答案
另类
即使 List 或 T[][] 类型的二维数组也不是可序列化的。这与 Unity 中通用序列化的限制有关。定义具体类的简单替代方法如下:
[Serializable]
public class GameObjectList //not a monobehavior
public List<GameObject> gameObjects;
稍后将其用作字段
public GameObjectList[] pieces;
这应该会在 Inspector 中显示一个列表列表,让您可以引用您的 GameObjects。当然,这种方法有点麻烦,每次都要定义一个新的类,但是可以。
注意事项:
围绕通用序列化的许多限制在 Unity 2020.2 更新中已解除,但您仍然无法直接序列化 2D 数组/列表。
【讨论】:
Serializable 是的,但正如正确所说,Unity 不会对其进行序列化;) 您的替代方案是否允许我引用我的游戏对象? 是的,它将允许您引用您的游戏对象。 @ALK003以上是关于无法统一引用游戏对象的 2D 数组的主要内容,如果未能解决你的问题,请参考以下文章