当我第一次将Canvas元素中的特定游戏对象设置为活动状态(SetActive(true))时,它会滞后一段时间。顺序激活是瞬时的。请注意,这只发生在独立播放器中。在编辑器中,它根本没有滞后。我的猜测显然是第一次加载资产。但是,我可以以任何方式预加载此特定资产吗?我试图在优化下的构建设置中这样做,但这并没有影响任何事情。不,我没有启动所述游戏对象的Start()函数或OnEnable()函数中的任何代码。
答案 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会更新所有画布内容,甚至禁用的对象。为了防止未使用的对象更新,请将它们隔离在不同的画布中。如果愿意,您甚至可以将这些画布作为原始画布的子代。