【发布时间】:2018-08-22 09:07:10
【问题描述】:
我正在制作一个视频游戏,虽然我有一个现有的通用 C# 代码,但我现在必须将它移到 Unity。我对通用 C# 有一些基础知识,但我刚刚开始学习 Unity 编码方式。
对于初学者,我想编写一个代码,将所有游戏区域定位到正确的位置,然后使它们不可见。是的,不要惊讶,他们需要都在同一个地方。
区域可以有三种尺寸选择,我称它们为小、中和大。小面积和大面积都必须手动写入。
List <GameObject> SmallAreas = new List<GameObject>();
void DefineSmallAreas()
{
SmallAreas.Add(areaConfirmLoad);
SmallAreas.Add(areaConfirmQuit);
SmallAreas.Add(areaConfirmSave);
SmallAreas.Add(areaGameSaved);
SmallAreas.Add(areaSave);
SmallAreas.Add(areaLoad);
}
大面积也是如此。
现在,所有其他领域,都是中等的,而且数量很多。
所以,我想检查所有属于“areaContainer”子项的游戏对象,检查它们的名称是否以“area”开头,如果是,我想将它们添加到 MediumAreas 列表中。强>
我就是这样尝试的:
void DefineMediumAreas()
{
GameObject areaContainer = GameObject.Find("areaContainer");
foreach (GameObject thisObject in areaContainer)
{
char[] a = thisObject.Name.ToCharArray();
if (a.Length >= 4)
{
char[] b = { a[0], a[1], a[2], a[3] };
string thisObjectType = new string(b);
(if (thisObjectType == "area")&&(!(SmallAreas.Contains(thisObject))
&&(!(LargeAreas.Contains(thisObject)))
{
MediumAreas.Add(thisObject);
}
}
}
然而,这显示了一个错误,“areaContainer”不能以这种方式使用,我现在无法访问 Unity,因此无法复制确切的消息。我认为它类似于“Gameobject 没有 IEnumerator”。
我确实尝试用谷歌搜索更好的方法,并找到了一种叫做“转换”的东西。
foreach(Transform child in transform)
{
Something(child.gameObject);
}
我不明白的是,如何在我的具体情况下使用这种“转换”。
如果这个问题很傻,请不要生我的气,我对Unity很陌生,必须从头开始学习。
还有一个小问题。将物体变为隐形的工作是否有效:
foreach(GameObject thisObject in MediumAreas)
{
thisObject.position = MediumVector;
thisObject.GetComponent<Renderer>().enabled = false;
}
MediumVector 是对象必须移动到的位置,它似乎正在工作。
【问题讨论】:
-
附注:您可以使用 thisObject.Name.StartsWith("area") 检查名称是否以“area”开头。
-
另一个注意事项:如果您打算使用 Unity3D 做任何重要的事情,您绝对需要了解什么是变换以及如何使用它。这是引擎的关键概念之一。
-
这不是你使用
foreach的方式。areaContainer是否有一个属性是GameObjects的集合?如果是这样,请使用foreach(GameObject thisObject in areaContainer.collectionsOfObjects){...}(至少在 C# 中是这样的) -
areaContainer 是包含所有其他对象的对象。另外,感谢您谈论“Name.StartsWith”
标签: c# loops unity3d foreach gameobject