SetActive 的反应不同
SetActive reacts differently
根据输入字符串,我想在脚本中激活我的游戏对象。我的游戏对象拥有一个 public 字符串,我将其与给定数组的值进行比较:
GameObject parent = GameObject.Find("Pick Ups");
int childCount = parent.transform.childCount;
foreach (var s in arr)
{
for (int i = 0; i < childCount; ++i)
{
// Deactivate Target if it is not part of the Active Objects List
if (s == parent.transform.GetChild(i).GetComponent<Rotator>().targetID)
{
parent.transform.GetChild(i).gameObject.SetActive(true);
Debug.Log("Element " + s + " activated");
} else {
parent.transform.GetChild(i).gameObject.SetActive(false);
}
}
}
这工作正常。现在我增加了输入的信息量,将其存储在 3 维数组中,然后循环抛出包含与之前相同信息的第一个维度:
var tArr = aTLString.Split('~')
.Select(x => x.Split('^')
.ToArray()
.Select(y => y.Split('`'))
.ToArray())
.ToArray();
for (int j = 0; j < tArr.GetLength(0); ++j)
{
for (int i = 0; i < childCount; ++i)
{
// Deactivate Target if it is not part of the Active Objects List
if (tArr[j][0][0] == parent.transform.GetChild(i).GetComponent<Rotator>().targetID)
{
parent.transform.GetChild(i).gameObject.SetActive(true);
Debug.Log("Element " + tArr[j][0][0] + " activated");
} else {
parent.transform.GetChild(i).gameObject.SetActive(false);
}
}
}
这次,元素没有被激活。我收到控制台反馈,元素已激活(因此 tArr[j][0][0] 包含正确的字符串)但 SetActivate 似乎无法正常工作。
我不明白这个问题
在 tArr
的每次迭代中,您都在 所有 个对象上调用 SetActive
。
即使一个对象在第一遍中被匹配,它在随后的几遍中被停用,使得只有最后一遍有效。
你的算法相当于(尽量简洁):
public class Thing
{
public int Id;
public bool Active = false;
public Thing(int id) { Id = id; }
}
void Main()
{
var targetIds = new int[] {2, 5, 7 };
var things = new Thing[] {new Thing(1), new Thing(2), new Thing(3)};
foreach (var id in targetIds)
{
foreach (var thing in things)
{
thing.Active = thing.Id == id;
Console.WriteLine($"{thing.Id} active: {thing.Active}");
}
}
}
这输出:
1 active: False
2 active: True
3 active: False
1 active: False
2 active: False
3 active: False
1 active: False
2 active: False
3 active: False
您可以看到,尽管 ID 2 在 targetIds
的第一次迭代中匹配,但随后会在后续遍历中重置。
您可能想要做的是首先将所有对象设置为非活动状态,然后才遍历 tArr
并激活匹配的对象,但不要停用不匹配的对象。
或者,如果对象的 ID 包含在 tArr
.
中,您可以只对对象进行一次迭代并激活它们
foreach (var thing in things)
{
thing.Active = targetIds.Contains(thing.Id);
}
根据输入字符串,我想在脚本中激活我的游戏对象。我的游戏对象拥有一个 public 字符串,我将其与给定数组的值进行比较:
GameObject parent = GameObject.Find("Pick Ups");
int childCount = parent.transform.childCount;
foreach (var s in arr)
{
for (int i = 0; i < childCount; ++i)
{
// Deactivate Target if it is not part of the Active Objects List
if (s == parent.transform.GetChild(i).GetComponent<Rotator>().targetID)
{
parent.transform.GetChild(i).gameObject.SetActive(true);
Debug.Log("Element " + s + " activated");
} else {
parent.transform.GetChild(i).gameObject.SetActive(false);
}
}
}
这工作正常。现在我增加了输入的信息量,将其存储在 3 维数组中,然后循环抛出包含与之前相同信息的第一个维度:
var tArr = aTLString.Split('~')
.Select(x => x.Split('^')
.ToArray()
.Select(y => y.Split('`'))
.ToArray())
.ToArray();
for (int j = 0; j < tArr.GetLength(0); ++j)
{
for (int i = 0; i < childCount; ++i)
{
// Deactivate Target if it is not part of the Active Objects List
if (tArr[j][0][0] == parent.transform.GetChild(i).GetComponent<Rotator>().targetID)
{
parent.transform.GetChild(i).gameObject.SetActive(true);
Debug.Log("Element " + tArr[j][0][0] + " activated");
} else {
parent.transform.GetChild(i).gameObject.SetActive(false);
}
}
}
这次,元素没有被激活。我收到控制台反馈,元素已激活(因此 tArr[j][0][0] 包含正确的字符串)但 SetActivate 似乎无法正常工作。
我不明白这个问题
在 tArr
的每次迭代中,您都在 所有 个对象上调用 SetActive
。
即使一个对象在第一遍中被匹配,它在随后的几遍中被停用,使得只有最后一遍有效。
你的算法相当于(尽量简洁):
public class Thing
{
public int Id;
public bool Active = false;
public Thing(int id) { Id = id; }
}
void Main()
{
var targetIds = new int[] {2, 5, 7 };
var things = new Thing[] {new Thing(1), new Thing(2), new Thing(3)};
foreach (var id in targetIds)
{
foreach (var thing in things)
{
thing.Active = thing.Id == id;
Console.WriteLine($"{thing.Id} active: {thing.Active}");
}
}
}
这输出:
1 active: False
2 active: True
3 active: False
1 active: False
2 active: False
3 active: False
1 active: False
2 active: False
3 active: False
您可以看到,尽管 ID 2 在 targetIds
的第一次迭代中匹配,但随后会在后续遍历中重置。
您可能想要做的是首先将所有对象设置为非活动状态,然后才遍历 tArr
并激活匹配的对象,但不要停用不匹配的对象。
或者,如果对象的 ID 包含在 tArr
.
foreach (var thing in things)
{
thing.Active = targetIds.Contains(thing.Id);
}