問題はUnityがアクティブでないゲームオブジェクトを見つけることができないということです。 GameObject.Find
は、アクティブなゲームオブジェクトのみを検出します。 GameObjectを見つけてグローバル変数に格納するか、変数をpublicにしてエディタから割り当てる必要があります。
私の解決策では、グローバル変数を使用して、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
機能で使用すると良いです。が
USAGE:
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;
}
の中、積極的ゲームオブジェクトタグで検索:
void Start()
{
GameObject objByName = FindInActiveObjectByName("Cube");
GameObject objByTag = FindInActiveObjectByTag("CubeTag");
GameObject objByLayer = FindInActiveObjectByLayer(LayerMask.NameToLayer("CubeLayer"));
}
がインアクティブ名によるゲームオブジェクト検索
1つのゲームオブジェクトを探す
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"));
}
で、アクティブなゲームオブジェクト[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();
}
の中に、アクティブなゲームオブジェクト[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();
}
をインアクティブにすることによってゲームオブジェクト[S]検索層:
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();
}
どうもありがとう。このケースでは、私のコルーチンソリューションを構築して解決したので、他の回答を受け入れたものとしてマークする必要がありましたが、あなたの答えはとてもエレガントで便利です。少し違った状況で試してみましたが、それは魅力のように機能します。どうもありがとう – Joshua