c# - 按名称、标签或图层查找不活动的游戏对象

标签 c# unity3d

首先,我需要停用一个游戏对象,然后在 10 秒后激活它,所以我认为协程是合适的:

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 来查找 inactive 游戏对象,但是当然.SetActive 现在不起作用,因为 obj 实际上不是游戏对象...

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

我试过 obj.gameObject.SetActive(true) 但肯定是错的,因为对象不会复活...

最佳答案

问题是 Unity 无法找到不活动的游戏对象。 GameObject.Find 只会找到事件的 GameObject。您应该找到 GameObject 并将其存储在全局变量中,或者公开该变量,然后从编辑器中分配它。

我的解决方案使用一个全局变量,然后将游戏对象存储在初学者中,这样您就不必再次寻找它。

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);
}

下面是我制作的包装器,它可以通过名称、标签或层找到游戏对象,即使它们是非事件的。

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

找到一个游戏对象:

用法:

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

按名称查找不活动的游戏对象:

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 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;
}

按层查找不活动的游戏对象:

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;
}


查找所有游戏对象(注意以下所有函数名称中对象中的“s”):

用法:

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

按名称查找不活动的 GameObject[s]:

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();
}

按标签查找不活动的 GameObject[s]:

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();
}

按层查找不活动的游戏对象:

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();
}

关于c# - 按名称、标签或图层查找不活动的游戏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44456133/

相关文章:

c# - 显示来自 Reporting Services 的 PDF

c# - 我可以避免存储 MS Exchange 凭据,同时仍然能够进行身份验证(针对 EWS)吗?

opencv - 如何计算新的相机在3d空间中的位置和旋转,以在移动3d对象后获得完全相同的 View ?

c# - 为什么我们在初始化Vector3时使用 "new"关键字,而不是整数?

c# - 系统.Web.HttpException : Cannot have multiple items selected in a DropDownList

c# - Web API 2 在使用 ajax post 时寻找 get?

facebook - Unity Facebook AppRequest崩溃

c# - 在命名空间中访问类中的 float

c# - 防止使用 ClickOnce 部署调试版本

c# - Unity3D - 构建失败,因为 "[Unity] ERROR: An asset is marked with HideFlags.DontSave but is included in the build:"