Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 第一次将游戏对象设置为活动状态时,它会延迟_C#_Unity3d - Fatal编程技术网

C# 第一次将游戏对象设置为活动状态时,它会延迟

C# 第一次将游戏对象设置为活动状态时,它会延迟,c#,unity3d,C#,Unity3d,当我第一次将Canvas元素中的某个特定游戏对象设置为active(SetActive(true))时,它会延迟一秒钟左右。连续激活是瞬时的。请注意,这只发生在独立播放器中。在编辑器中,它一点也不滞后。我的猜测显然是,它第一次必须加载资产。但是,我可以以任何方式预加载此特定资产吗?我试图在“优化”下的“构建设置”中这样做,但这并没有影响任何事情。不,我在所述游戏对象的Start()函数或OnEnable()函数中没有任何启用的代码。这是预期的。延迟取决于画布的层次结构下有多少UI组件和游戏对象。

当我第一次将Canvas元素中的某个特定游戏对象设置为active(SetActive(true))时,它会延迟一秒钟左右。连续激活是瞬时的。请注意,这只发生在独立播放器中。在编辑器中,它一点也不滞后。我的猜测显然是,它第一次必须加载资产。但是,我可以以任何方式预加载此特定资产吗?我试图在“优化”下的“构建设置”中这样做,但这并没有影响任何事情。不,我在所述游戏对象的Start()函数或OnEnable()函数中没有任何启用的代码。

这是预期的。延迟取决于
画布的层次结构下有多少
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)
启用/禁用画布下的对象会导致冻结。您可以使用
组件
非游戏对象上的
启用
来修复此问题。我提供的示例适用于
画布
,但将使用其下的组件,例如
文本
图像