activeSelf(read only只讀):物體本身的active狀態,對應於其在inspector中的checkbox是否被勾選
activeInHierarchy(read only只讀):物體在層次中是否是active的。也就是說要使這個值為true,這個物體及其所有父物體(及祖先物體)的activeself狀態都為true。
一個物體要在場景中是可見的(不是隱藏的),那么不僅僅其本身的activeSelf要為true,其所有父物體(及祖先物體)的activeself狀態都要為true。
總結:
activeInHierarchy狀態代表物體在場景中的實際的active狀態。實際上代表的是物體及其所有祖先物體的activeSelf狀態。而activeSelf對應於其在inspector中的checkbox是否被勾選
activeSelf狀態代表物體自身的activeSelf狀態,所以當物體本身activeSelf為true,而其所有祖先物體的activeSelf狀態不全為true時,這個物體的activeInHierarchy狀態為false。
activeSelf==物體自身
activeInHierarchy==物體自身及其所有祖先物體==物體在場景中實際上是否激活
至於SetActive,改變的是物體自身的activeSelf狀態,所以,對一個物體SetActive時,其在場景中可能不會被激活,因為其祖先物體可能存在未被激活的。
SetActiveRecursively,改變物體自身及其所有子物體的activeSelf狀態,相當於對物體自身及其所有子物體調用SetActive.
由於SetActiveRecursively已過時(obsolete),未來將移除,所以,當設置一個物體及其所有子物體的active狀態時,可以調用一下方法
void DeactivateChildren(GameObject g, bool a) {
g.activeSelf = a;
foreach (Transform child in g.transform) {
DeactivateChildren(child.gameObject, a);
}
}
Advanced Skill :
Using Extension Method
public static class Extensions
{
public static void SetactivateForAllChildren(this GameObject go, bool state)
{
DeactivateChildren(go, state);
}
public static void DeactivateChildren(GameObject go, bool state)
{
go.SetActive(state);
foreach (Transform child in go.transform)
{
DeactivateChildren(child.gameObject, state);
}
}
}
Now You Can Use Like That:
public class MyTest : MonoBehaviour {
public GameObject go;
// Use this for initialization
void Start () {
//過時
//go.SetActiveRecursively(true);
go.SetactivateForAllChildren(true);
}
}


參考:
http://blog.csdn.net/czlilove/article/details/23827267
Unity 3.5 到 4.0升級指南 Upgrade Guide from Unity 3.5 to 4.0
http://game.ceeger.com/Manual/UpgradeGuide3540.html
