乒乓球世界杯_世界杯结束时间 - 0123838.com
首页中国对巴西世界杯正文

unity中使用SetActive()和gameobject实例化的陷坑总结

2025-09-08 12:11:43

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开销大,目前自己还了解其它激活/显示物体的方法,有待学习。

充电时电量的显示图标为何是白色的,是手机坏了么我记得以前是绿色的 英阿世界杯大战:足球历史上的经典对决与恩怨情仇
相关内容