gameobject.SetActive()用于激活或禁用gameobject,常用判断当在A情况下时SetActive(ture)、在B情况下时SetActive(false)。自己多次给自己挖坑,解决办法是public gameobject进行实例化。
1. 临时实例化的gameobject在SetActive(false)后无法再SetActive(ture)
Bug:
int TapFlag = 1;
private void OnTap()
{
GameObject canvas = GameObject.Find("canvas3");
if (TapFlag == 1)
{
canvas.SetActive(false);
TapFlag = 0;
}
else {
canvas.SetActive(true);
TapFlag = 1;
}
修改:将需要SetActive()的gameobject设为public,在Inspector中进行实例化
public GameObject canvas;
int TapFlag = 1;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnTap()
{
if (TapFlag == 1)
{
canvas.SetActive(false);
TapFlag = 0;
}
else {
canvas.SetActive(true);
TapFlag = 1;
}
}
2. public GameObject的好处:同一个脚本控制多个对象的相同类别的childobject/component 时,将脚本分别附给多个对象,在对象自己的Inspector中实例化相应的GameObject。
eg:
这段用于Hololens的代码实现的功能:当视线投射于/离开某个物体时,显示/隐藏该物体的UI信息,场景中有多个带有自己UI信息的物体。
最开始自己将此功能写在GazeManager脚本中,用HitInfo.transform.CompareTag()来判断视线投射的物体以激活响应的UI,蠢哭。
现在是把该脚本附给每一个物体,在各自脚本下实例化各自SetActive的子物体。毕竟拖拽比一个个写CompareTag()或者GameObjcet.Find()简单多了。
public GameObject cchild;
void Update()
{
if (GazeManager.Instance.Hit && this.name == GazeManager.Instance.HitInfo.transform.name)
{
cchild.SetActive(true);
}
else
{
cchild.SetActive(false);
}
}
另:有看到说GameObject.SetActive的CPU开销大,目前自己还了解其它激活/显示物体的方法,有待学习。