我是Unity的新手,有一个问题就是从我这里偷走了太多时间。
无论如何,我试图从场景中获取对象标签,同时具有X和Z的位置。指定,我希望通过获取我的机器人周围的游戏对象标签来获取神经网络的输入。是否有像GetComponent<>()
这样的函数或带有x,z和返回标记的东西?
另一个问题是,我手动将emptyObject
放在每个空白区域,这样我就可以获得回报。如果我删除这些&#39; void blocks&#39;会有问题吗?并尝试检查特定x,z位置的某些内容?
答案 0 :(得分:3)
您可以使用Transform
搜索场景中的每个对象,然后查找具有x和z位置的对象并返回标记。 Resources.FindObjectsOfTypeAll
和GameObject.FindObjectsOfType
函数可以执行此操作,但为了提高性能,请使用Scene.GetRootGameObjects
从每个根对象的子节点获取所有根对象和循环{{1}并检查x和z位置是否匹配。
使用它们,因为它们不返回数组,只填充List。
查找场景中的所有对象:
GetComponentsInChildren<Transform>
使用x,z位置查找对象标记:
private List<GameObject> rootGameObjects = new List<GameObject>();
private List<Transform> childObjs = new List<Transform>();
private void GetAllRootObject()
{
Scene activeScene = SceneManager.GetActiveScene();
activeScene.GetRootGameObjects(rootGameObjects);
}
private void GetAllChildObjs()
{
for (int i = 0; i < rootGameObjects.Count; ++i)
{
GameObject obj = rootGameObjects[i];
//Get all child components attached to this GameObject
obj.GetComponentsInChildren<Transform>(true, childObjs);
}
}
<强> USAGE 强>:
bool xzEquals(Vector3 pos1, Vector3 pos2)
{
return (Mathf.Approximately(pos1.x, pos2.x)
&& Mathf.Approximately(pos1.z, pos2.z));
}
string GetTagFromPos(float x, float z)
{
Vector3 pos = new Vector3(x, 0, z);
rootGameObjects.Clear();
childObjs.Clear();
GetAllRootObject();
GetAllChildObjs();
//Loop through all Objects
for (int i = 0; i < childObjs.Count; i++)
//check if x and z matches then return tag
if (xzEquals(childObjs[i].position, pos))
return childObjs[i].tag;
return null;
}
GameObject GetObjectFromPos(float x, float z)
{
Vector3 pos = new Vector3(x, 0, z);
rootGameObjects.Clear();
childObjs.Clear();
GetAllRootObject();
GetAllChildObjs();
//Loop through all Objects
for (int i = 0; i < childObjs.Count; i++)
//check if x and z matches then return the Object
if (xzEquals(childObjs[i].position, pos))
return childObjs[i].gameObject;
return null;
}
如果您想在循环中节省一些时间,也可以手动将要搜索的对象放到列表中。