如何获取Object标记的位置?

时间:2018-05-09 11:40:09

标签: c# unity3d components gameobject

我是Unity的新手,有一个问题就是从我这里偷走了太多时间。

无论如何,我试图从场景中获取对象标签,同时具有X和Z的位置。指定,我希望通过获取我的机器人周围的游戏对象标签来获取神经网络的输入。是否有像GetComponent<>()这样的函数或带有x,z和返回标记的东西?

另一个问题是,我手动将emptyObject放在每个空白区域,这样我就可以获得回报。如果我删除这些&#39; void blocks&#39;会有问题吗?并尝试检查特定x,z位置的某些内容?

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用Transform搜索场景中的每个对象,然后查找具有x和z位置的对象并返回标记。 Resources.FindObjectsOfTypeAllGameObject.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;
}

如果您想在循环中节省一些时间,也可以手动将要搜索的对象放到列表中。