在这里我可以问很多关于数组的问题,但是我会坚持一个特定的问题。如果您在下面的代码中发现其他效率低下的情况,请知道,我并不是想让您接受解决此问题的挑战。
我的特定问题是我想循环遍历锯齿状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
}
答案 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
请注意如何在底部匹配菜单下将其变成锯齿状的数组
公共类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循环和更少的变量使它更优雅-但它可以工作!谢谢你们!每个人都有车!