//---------------------------------------------------------------------------- /*! * @brief オブジェクト以下のコンポーネントの有効無効を取得 * @note Unityはバージョンアップでこの辺の仕様がちょこちょこ変化するため、ユーティリティ化して影響を最小限に抑える */ //---------------------------------------------------------------------------- static public bool ChkObjectEnabled(GameObject cObj) { #if DEF_OBJECT_ENABLE_QUICK //------------------------------ // //------------------------------ if (cObj == null) { return(false); } // return cObj.activeSelf; return(cObj.activeInHierarchy); #else //------------------------------ // //------------------------------ if (cObj == null) { return(false); } //------------------------------ // オブジェクトの有効無効状態を取得 //------------------------------ ObjectEnabled cComponentEnabled = cObj.GetComponent <ObjectEnabled>(); if (cComponentEnabled == null) { //------------------------------ // オブジェクトのコンポーネントが存在しない場合、 // 一度も無効化処理を呼んでいないことが保証できるため、オブジェクトの状態を参照 //------------------------------ return(cObj.activeSelf); // return true; } return(cComponentEnabled.m_ObjEnabled); #endif }
//---------------------------------------------------------------------------- /*! * @brief 階層以下のオブジェクトの有効無効を総当たりで指定。 * @note 子供階層も込で全てを有効化。 * @note Unityはバージョンアップでこの辺の仕様がちょこちょこ変化するため、ユーティリティ化して影響を最小限に抑える */ //---------------------------------------------------------------------------- static public void SetObjectEnabled(GameObject cObj, bool bEnabled) { //------------------------------ // //------------------------------ if (cObj == null) { return; } #if DEF_OBJECT_ENABLE_QUICK //------------------------------ // オブジェクトの状態を設定。 //------------------------------ if (cObj.activeSelf != bEnabled) { cObj.SetActive(bEnabled); } #else //------------------------------ // オブジェクトの状態を設定。 // // 本来は固定で有効化してコンポーネントだけ切り替えたいが、 // Unity4になる以前に組んでいた部分で、Animationのデフォルト再生処理を期待している部分があるため一旦こちらで対応。 // アニメーションの再生指示の調整が完了したら常時有効に切り替える //------------------------------ if (cObj.activeSelf != bEnabled) { cObj.SetActive(bEnabled); } //------------------------------ // オブジェクトの有効無効フラグを切り替え // 若干重い処理なので、フラグが変わってないならコンポーネントの更新を省く //------------------------------ bool bComponentUpdate = true; { ObjectEnabled cComponentEnabled = cObj.GetComponent <ObjectEnabled>(); if (cComponentEnabled == null) { cComponentEnabled = cObj.AddComponent <ObjectEnabled>(); } else if (cComponentEnabled.m_ObjEnabled == bEnabled) { bComponentUpdate = false; } cComponentEnabled.m_ObjEnabled = bEnabled; } //------------------------------ // コンポーネント有効無効切り替え //------------------------------ if (bComponentUpdate == true) { Behaviour[] acComponent = cObj.GetComponents <Behaviour>(); for (int i = 0; i < acComponent.Length; i++) { if (acComponent[i] == null) { continue; } //------------------------------ // NGUIで使用しているスクリプトの一部は // 強制的に有効化すると挙動に不具合が生じるのでスルー //------------------------------ if (acComponent[i].GetType() == typeof(SpringPanel)) { continue; } acComponent[i].enabled = bEnabled; } Renderer[] acRenderer = cObj.GetComponents <Renderer>(); for (int i = 0; i < acRenderer.Length; i++) { acRenderer[i].enabled = bEnabled; } Collider[] acCollider = cObj.GetComponents <Collider>(); for (int i = 0; i < acCollider.Length; i++) { acCollider[i].enabled = bEnabled; } } #endif //------------------------------ // 無効化はトップノードだけオフったら終わりでOK //------------------------------ if (bEnabled == false) { return; } //-------------------------------- // 再帰処理で子供を全てチェック //-------------------------------- #if true // @Change Developer 2015/11/04 warning除去。 int nChildCount = cObj.transform.childCount; for (int i = 0; i < nChildCount; i++) #else for (int i = 0; i < cObj.transform.GetChildCount(); i++) #endif { GameObject cChildObj = cObj.transform.GetChild(i).gameObject; if (cChildObj == null) { continue; } SetObjectEnabled(cChildObj, bEnabled); } }
//---------------------------------------------------------------------------- /*! * @brief オブジェクトの有効無効を指定。 * @note 子供階層はたどらない。 */ //---------------------------------------------------------------------------- static public void SetObjectEnabledOnce(GameObject cObj, bool bEnabled) { //------------------------------ // //------------------------------ if (cObj == null) { return; } #if DEF_OBJECT_ENABLE_QUICK //------------------------------ // オブジェクトの状態を設定。 //------------------------------ if (cObj.activeSelf != bEnabled) { cObj.SetActive(bEnabled); } #else #if false //------------------------------ // オブジェクトの状態を強制的に有効化。 // 有効無効を切り替えるとオブジェクトの再生成が走ったりしてメモリが荒れるらしい。 // オブジェクト自体は常時有効化しておき、コンポーネントのみを排除することで切り替え付加を軽減する //------------------------------ if (cObj.activeSelf == false) { cObj.SetActive(true); } #else //------------------------------ // オブジェクトの状態を設定。 // // 本来は固定で有効化してコンポーネントだけ切り替えたいが、 // Unity4になる以前に組んでいた部分で、Animationのデフォルト再生処理を期待している部分があるため一旦こちらで対応。 // アニメーションの再生指示の調整が完了したら常時有効に切り替える //------------------------------ if (cObj.activeSelf != bEnabled) { cObj.SetActive(bEnabled); } #endif //------------------------------ // コンポーネント有効無効切り替え //------------------------------ Behaviour[] acComponent = cObj.GetComponents <Behaviour>(); for (int i = 0; i < acComponent.Length; i++) { acComponent[i].enabled = bEnabled; } Renderer[] acRenderer = cObj.GetComponents <Renderer>(); for (int i = 0; i < acRenderer.Length; i++) { acRenderer[i].enabled = bEnabled; } Collider[] acCollider = cObj.GetComponents <Collider>(); for (int i = 0; i < acCollider.Length; i++) { acCollider[i].enabled = bEnabled; } //------------------------------ // オブジェクトの有効無効状態を保持 //------------------------------ { ObjectEnabled cComponentEnabled = cObj.GetComponent <ObjectEnabled>(); if (cComponentEnabled == null) { cComponentEnabled = cObj.AddComponent <ObjectEnabled>(); } cComponentEnabled.m_ObjEnabled = bEnabled; } #endif }