2017-06-09 9 views
0

まずによって、非アクティブなゲームオブジェクトを検索し、私はゲームオブジェクトを無効にする必要があり、その後、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); 
} 

もちろん、私はもうできません私はそのように変換したキャストにはどうすればよいです...ので、私は非アクティブゲームオブジェクトを見つけるためにtransform.Findを使用しますが、objが実際にゲームオブジェクトではありませんので、もちろん.SetActiveの今、動作しません

GameObject.Findを使用すること再びアクティブに設定できますか?

オブジェクトが生活に戻って来ないのでInvokeがコルーチンより良いオプションは、あなたの場合は...、

答えて

5

問題は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(); 
} 
2

を私はobj.gameObject.SetActive(true)を試してみましたが、それは間違っていなければなりません。また、私が知る限り、非アクティブなオブジェクトを見つけることはできません。したがって、見つかったオブジェクトをフィールドに割り当てる必要があります。

var obj; 

void BarDeactivate(){ 
    obj = GameObject.Find("OBJ"); 
    obj.SetActive(false); 
} 

void BarReactivate(){ 
    obj.SetActive(true); 
} 

次のように呼び出しを経由してそれらを呼び出す:

Invoke("BarDeactivate", sec); 
Invoke("BarReactivate", sec); 
+0

どうもありがとう。このケースでは、私のコルーチンソリューションを構築して解決したので、他の回答を受け入れたものとしてマークする必要がありましたが、あなたの答えはとてもエレガントで便利です。少し違った状況で試してみましたが、それは魅力のように機能します。どうもありがとう – Joshua

関連する問題