如何将值从一个数组的对象内分配到另一个数组?

时间:2018-07-09 23:51:02

标签: c# unity3d

在这里我可以问很多关于数组的问题,但是我会坚持一个特定的问题。如果您在下面的代码中发现其他效率低下的情况,请知道,我并不是想让您接受解决此问题的挑战。

我的特定问题是我想循环遍历锯齿状menu [] []数组的整个长度,然后我从我的button []数组中提取Vector3值,并将其分配给Vector3 []数组。

我不确定为什么我不能做下面发布的事情,但是我得到了:

1)NullReferenceException错误(在buttonPos [n] = button [n] .transform.position,

2)“字段'MatrixPicker.buttonPos'从未分配,并且将始终具有其默认值'null'”,

...当我尝试时。我所有的button [] GameObjects都位于Unity所属的公共字段中。

这是我的代码:

public class MatrixPicker : MonoBehaviour {

string[][] menu;
public GameObject[] buttons;
private Vector3[] buttonPos;

void Start () {

    menu = new string[][]{
        new string[]{"a"},
        new string[]{"b"},
        new string[]{"c", "d", "e"},
        new string[]{"f", "g", "h"}
    };


    int tot = 0;

    for (int i = 0; i < menu.Length; i++){
        string[] innerArray = menu[i];
        for (int a = 0; a < innerArray.Length; a++){
            tot++;
            int n = tot-1;
            buttonPos[n] = buttons[n].transform.position;
        }
    }
}
//other code
}

4 个答案:

答案 0 :(得分:1)

在尝试设置buttonPos的元素之前,需要对其进行初始化。例如:

private Vector3[] buttonPos = new Vector3[menu.Length];  //Create an array that can contain one vector for each menu item

一旦初始化了buttonPos数组,就可以使用循环来初始化每个数组 element ,这是一个独立的操作。

答案 1 :(得分:1)

据我所知,您没有绑定GameObject,因此它始终指向空(空)。您可以尝试将对象与GameObject.FindWithTag绑定吗? 另外,您还需要初始化数组。

示例:

buttons = GameObject.FindGameObjectsWithTag("YOUR_OBJECT'S_TAG");

我也建议使用foreach代替for循环:

for(Item item: list)
{
  //Your code;
}

希望有帮助!

答案 2 :(得分:1)

buttonPos是一个私有变量,因此我可以推断出您不是在使用它之前对其进行了初始化。下面的代码将解决此错误。

queue_service.put_message(response_queue, base64.b64encode(json.dumps(response).encode('utf-8')))

您还希望最初将其定义为null,以避免编译器因使用可能未声明的变量而出错

TypeError: message should be of type str

使用列表替代一维buttonPos数组

请注意如何在底部匹配菜单下将其变成锯齿状的数组

公共类MatrixPicker:MonoBehaviour {

    void Start () {

        menu = new string[][]{
            new string[]{"a"},
            new string[]{"b"},
            new string[]{"c", "d", "e"},
            new string[]{"f", "g", "h"}
        };


        int tot = 0;
        int arrayLength = 0;
        foreach(string[] array in menu)
        {
            arrayLength += array.Length;
        }

        //initialise it here
        buttonPos = new Vector3[arrayLength];

        for (int i = 0; i < menu.Length; i++){
            string[] innerArray = menu[i];

            for (int a = 0; a < innerArray.Length; a++){
                tot++;
                int n = tot-1;

                //then you can assign it here
                buttonPos[n] = buttons[n].transform.position;
            }
        }
    }

答案 3 :(得分:0)

这行得通!

string[][] menu;
private int X = 0;
private int Y = 0;
public GameObject[] buttons;

void Start () {

    menu = new string[][]{
        new string[]{"a"},
        new string[]{"b"},
        new string[]{"c", "d", "e"},
        new string[]{"f", "g", "h"}
    };

    print("menu Length = "+menu.Length);


    int tot = 0;

    for (int i = 0; i < menu.Length; i++){
        string[] innerArray = menu[i];
        for (int a = 0; a < innerArray.Length; a++){
            tot++;
        }
    }

    int n = tot-1;

    Vector3[] buttonPos = new Vector3[n];

    int count = 0;
    foreach(Vector3 button in buttonPos){
        buttonPos[count] = buttons[count].transform.position;
        print(buttonPos[count]);
        count++;
    }
}

这是可怕的,丑陋的,笨拙的,我需要整理一下,也许可以通过另一个foreach循环和更少的变量使它更优雅-但它可以工作!谢谢你们!每个人都有车!