首先,我需要停用一个游戏对象,然后在 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);
}
下面是我制作的包装器,它可以通过名称、标签或层找到游戏对象,即使它们是非事件的。
你不应该每一帧都使用它们,因为它们很慢。如果在 Start
或 Awake
函数中使用它们会很好。
找到一个游戏对象:
用法:
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/