C# 第一次将游戏对象设置为活动状态时,它会延迟
当我第一次将Canvas元素中的某个特定游戏对象设置为active(SetActive(true))时,它会延迟一秒钟左右。连续激活是瞬时的。请注意,这只发生在独立播放器中。在编辑器中,它一点也不滞后。我的猜测显然是,它第一次必须加载资产。但是,我可以以任何方式预加载此特定资产吗?我试图在“优化”下的“构建设置”中这样做,但这并没有影响任何事情。不,我在所述游戏对象的Start()函数或OnEnable()函数中没有任何启用的代码。这是预期的。延迟取决于C# 第一次将游戏对象设置为活动状态时,它会延迟,c#,unity3d,C#,Unity3d,当我第一次将Canvas元素中的某个特定游戏对象设置为active(SetActive(true))时,它会延迟一秒钟左右。连续激活是瞬时的。请注意,这只发生在独立播放器中。在编辑器中,它一点也不滞后。我的猜测显然是,它第一次必须加载资产。但是,我可以以任何方式预加载此特定资产吗?我试图在“优化”下的“构建设置”中这样做,但这并没有影响任何事情。不,我在所述游戏对象的Start()函数或OnEnable()函数中没有任何启用的代码。这是预期的。延迟取决于画布的层次结构下有多少UI组件和游戏对象。
画布的层次结构下有多少UI
组件和游戏对象。在Canvas
或UI组件上使用SetActive(true)
时,内存分配和绘图调用非常多。解决办法很简单。不要对UI使用SetActive(true)
,而是通过修改enabled
属性禁用组件
例如,要启用/禁用画布
:
Canvas canvas;
canvas.enabled = true; //Enable
canvas.enabled = false; //Disable
假设您只想禁用画布下的文本
组件,请使用enabled
属性禁用该文本
组件,而不是设置活动(true)
。同样的情况也适用于其他UI组件。这是意料之中的。延迟取决于画布
层次结构下的UI
组件和游戏对象的数量。在Canvas
或UI组件上使用SetActive(true)
时,内存分配和绘图调用非常多。解决办法很简单。不要对UI使用SetActive(true)
,而是通过修改enabled
属性禁用组件
例如,要启用/禁用画布
:
Canvas canvas;
canvas.enabled = true; //Enable
canvas.enabled = false; //Disable
假设您只想禁用画布下的文本
组件,请使用enabled
属性禁用该文本
组件,而不是设置活动(true)
。这同样适用于其他UI组件。公认的答案是一种变通方法,而不是解决方案。保持数百个UI元素的加载完全是对内存的浪费
相反,你应该像Unity所写的那样,把画布分开。延迟的原因是Unity在第一次启用对象时更新了所有画布内容,甚至是禁用的对象。要防止更新未使用的对象,请将它们隔离在不同的画布中。如果愿意,您甚至可以将这些画布作为原始画布的子画布。公认的答案是一种变通方法,而不是解决方案。保持数百个UI元素的加载完全是对内存的浪费
相反,你应该像Unity所写的那样,把画布分开。延迟的原因是Unity在第一次启用对象时更新了所有画布内容,甚至是禁用的对象。要防止更新未使用的对象,请将它们隔离在不同的画布中。如果您愿意,您甚至可以将这些画布作为原始画布的子画布。我需要一个using指令来使用它吗?Unity对此不满意。我尝试使用'enabled=false;'在我声明的一个游戏对象上,它不喜欢它。你需要使用UnityEngine.UI导入UnityUI。您还需要将canvas
变量设置为公共,以便可以从编辑器中分配它。。。。也canvas.enabled=true代码>和canvas.enabled=false代码>必须放在函数中。我想你误解了我的问题。有一个游戏对象,其中包含我想要启用/禁用的其他元素。画布始终处于启用状态,因为画布上还有其他东西。”“已启用”似乎不适用于游戏对象。我理解我们的问题。请再读一遍我的答案。使用SetActive(true)
启用/禁用画布下的对象会导致冻结。您可以使用组件
非游戏对象上的启用
来修复此问题。我提供的示例适用于Canvas
,但如果将Canvas替换为其中任何一个组件,则将使用其下的组件,例如Text
,Image
,RawImage
Slider
。如果这是要禁用的三维网格,也可以使用该组件。如果您使用SetActive(true)
禁用UI画布下的UI对象或游戏对象,您将被冻结。是的,但我不希望引用场景中的每个组件,特别是因为我必须通过标记找到它们,因为我有时会使用“DontDestroyOnLoad”之类的东西切换场景。在画布下启用我需要的每个组件根本不可行。谢谢你的帮助,但我已经解决了。我需要使用指令来使用它吗?Unity对此不满意。我尝试使用'enabled=false;'在我声明的一个游戏对象上,它不喜欢它。你需要使用UnityEngine.UI导入UnityUI。您还需要将canvas
变量设置为公共,以便可以从编辑器中分配它。。。。也canvas.enabled=true代码>和canvas.enabled=false代码>必须放在函数中。我想你误解了我的问题。有一个游戏对象,其中包含我想要启用/禁用的其他元素。画布始终处于启用状态,因为画布上还有其他东西。”“已启用”似乎不适用于游戏对象。我理解我们的问题。请再读一遍我的答案。使用SetActive(true)
启用/禁用画布下的对象会导致冻结。您可以使用组件
非游戏对象上的启用
来修复此问题。我提供的示例适用于画布
,但将使用其下的组件,例如文本
,图像
,