通过名称,标签或层查找不活动的GameObject [英] Find inactive GameObject by name, tag or layer

查看:58
本文介绍了通过名称,标签或层查找不活动的GameObject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我需要停用游戏对象,然后在10秒钟后将其激活,因此我认为协程是合适的:

First, I need to deactivate a game object and then after 10 seconds, activate it, so I thought coroutines are suitable:

IEnumerator BarDeactivate(float sec)
{
        yield return new WaitForSeconds(sec);

        var obj = GameObject.Find("OBJ");
        obj.SetActive(false);
}

IEnumerator BarReactivate(float sec)
{
        yield return new WaitForSeconds(sec);

        var obj = transform.Find("OBJ");
        obj.SetActive(true);
}

很明显,我不能再使用GameObject.Find,所以我使用transform.Find来找到非活动游戏对象,但是当然.SetActive现在不起作用,因为obj实际上不是一个游戏对象...

Obviously, I can no longer use GameObject.Find so I use transform.Find to find the inactive game object, but of course .SetActive now does not work, since obj is not actually a game object...

如何转换找到的变换,以便可以再次将其设置为活动状态?

How do I cast the found transform, so that it can be set active again?

我尝试了obj.gameObject.SetActive(true),但一定是错误的,因为该对象不会恢复原状...

I tried obj.gameObject.SetActive(true) but it must be wrong, because the object would not come back to life...

推荐答案

问题是Unity找不到无效的GameObject. GameObject.Find将仅找到活动的GameObject.您应该找到GameObject并将其存储在全局变量中,或者将变量设为公共变量,然后从编辑器中对其进行分配.

The problem is that Unity cannot find inactive GameObjects. GameObject.Find will only find active GameObject. You should either find and store the GameObject in a global variable or make the variable public then assign it from the Editor.

我的解决方案使用全局变量,然后将GameObject存储在初学者中,这样您就不必再次查找它.

My solution uses a global variable then stores the GameObject in the beginner so that you don't have to look for it again.

GameObject obj;

void Start()
{
    obj = GameObject.Find("OBJ");
}
IEnumerator BarDeactivate(float sec)
{
    yield return new WaitForSeconds(sec);
    obj.SetActive(false);
}

IEnumerator BarReactivate(float sec)
{
    yield return new WaitForSeconds(sec);
    obj.SetActive(true);
}


下面是我制作的包装程序,即使它们不活动,也可以通过名称,标签或层找到游戏对象.


Below is a wrapper I made that finds GameObjects by name, tag or layer even if they are inactive.

您不应该在每一帧都使用它们,因为它们很慢.如果在StartAwake函数中使用它们,则很好.

You shouldn't be using these every frame because they are slow. They are good if used in the Start or Awake function.

找到一个GameObject:

用法:

void Start()
{
    GameObject objByName = FindInActiveObjectByName("Cube");
    GameObject objByTag = FindInActiveObjectByTag("CubeTag");
    GameObject objByLayer = FindInActiveObjectByLayer(LayerMask.NameToLayer("CubeLayer"));
}

按名称查找无效的游戏对象:

Find in-active GameObject by Name:

GameObject FindInActiveObjectByName(string name)
{
    Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            if (objs[i].name == name)
            {
                return objs[i].gameObject;
            }
        }
    }
    return null;
}

通过标签查找无效的GameObject:

Find in-active GameObject by Tag:

GameObject FindInActiveObjectByTag(string tag)
{

    Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            if (objs[i].CompareTag(tag))
            {
                return objs[i].gameObject;
            }
        }
    }
    return null;
}

按图层查找无效的游戏对象:

Find in-active GameObject by Layer:

GameObject FindInActiveObjectByLayer(int layer)
{

    Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            if (objs[i].gameObject.layer == layer)
            {
                return objs[i].gameObject;
            }
        }
    }
    return null;
}



找到所有GameObjects (请注意下面所有函数名称中的"s" ):



Find all GameObjects (Notice the "s" in the Object from all the function names below):

用法:

void Start()
{
    GameObject[] objByNames = FindInActiveObjectsByName("Cube");
    GameObject[] objByTags = FindInActiveObjectsByTag("CubeTag");
    GameObject[] objByLayers = FindInActiveObjectsByLayer(LayerMask.NameToLayer("CubeLayer"));
}

通过名称查找无效的游戏对象:

Find in-active GameObject[s] by Name:

GameObject[] FindInActiveObjectsByName(string name)
{
    List<GameObject> validTransforms = new List<GameObject>();
    Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            if (objs[i].gameObject.name == name)
            {
                validTransforms.Add(objs[i].gameObject);
            }
        }
    }
    return validTransforms.ToArray();
}

通过标签查找无效的游戏对象:

Find in-active GameObject[s] by Tag:

GameObject[] FindInActiveObjectsByTag(string tag)
{
    List<GameObject> validTransforms = new List<GameObject>();
    Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            if (objs[i].gameObject.CompareTag(tag))
            {
                validTransforms.Add(objs[i].gameObject);
            }
        }
    }
    return validTransforms.ToArray();
}

按图层查找无效的游戏对象:

Find in-active GameObject[s] by Layer:

GameObject[] FindInActiveObjectsByLayer(int layer)
{
    List<GameObject> validTransforms = new List<GameObject>();
    Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
    for (int i = 0; i < objs.Length; i++)
    {
        if (objs[i].hideFlags == HideFlags.None)
        {
            if (objs[i].gameObject.layer == layer)
            {
                validTransforms.Add(objs[i].gameObject);
            }
        }
    }
    return validTransforms.ToArray();
}

这篇关于通过名称,标签或层查找不活动的GameObject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆