第一次将游戏对象设置为活动时它会滞后

时间:2016-09-06 01:24:45

标签: c# unity3d

当我第一次将Canvas元素中的特定游戏对象设置为活动状态(SetActive(true))时,它会滞后一段时间。顺序激活是瞬时的。请注意,这只发生在独立播放器中。在编辑器中,它根本没有滞后。我的猜测显然是第一次加载资产。但是,我可以以任何方式预加载此特定资产吗?我试图在优化下的构建设置中这样做,但这并没有影响任何事情。不,我没有启动所述游戏对象的Start()函数或OnEnable()函数中的任何代码。

3 个答案:

答案 0 :(得分:1)

预期。滞后取决于UI层次结构下的Canvas个组件和游戏对象的数量。在SetActive(true)或UI组件上使用Canvas时,会有很多内存分配和绘制调用。修复很简单。不要使用SetActive(true)用于UI,而是通过修改enabled属性来禁用组件。

例如,启用/禁用Canvas

Canvas canvas;
canvas.enabled = true; //Enable
canvas.enabled = false; //Disable

我们假设您只想禁用Text下的Canvas组件,请使用enabled属性禁用该Text组件,而不是{ {1}}。同样的事情也适用于其他UI组件。

答案 1 :(得分:1)

解决了它。对于未来的任何人:

未启用时将本地比例设置为0,启用时设置为1。像这样:

playerUI.transform.localScale = new Vector3(0, 0, 0);

playerUI.transform.localScale = new Vector3(1, 1, 1);

这样,Unity之前加载了对象。

答案 2 :(得分:1)

可接受的答案是一种解决方法,而不是解决方案。保持数百个UI元素加载是对内存的完全浪费。

您应该按照Unity this wonderful article中的说明,划分画布。出现延迟的原因是,当您首次启用对象时,Unity会更新所有画布内容,甚至禁用的对象。为了防止未使用的对象更新,请将它们隔离在不同的画布中。如果愿意,您甚至可以将这些画布作为原始画布的子代。