无法统一引用游戏对象的 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在统一 2d 中将相机连接到生成的玩家?

精灵在统一 2D C# 中不移动

如何将 2D Sprite 统一添加到材质中?

如何在统一编辑器中从场景创建可编写脚本的对象

统一的游戏对象计时器

统一构建并运行项目后出现蓝屏