gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:08:44 29 4
gpt4 key购买 nike

首先,我需要停用一个游戏对象,然后在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com