首页 > 解决方案 > 内存访问越界 - WebGL

问题描述

当我尝试加载我的网络游戏时,我收到了这个错误: 在此处输入图像描述

我的游戏加载在这个域: Highest Flavor Website Link

这是我在构建导出时的项目设置: 在此处输入图像描述

请给我一些建议来解决这个问题。

标签: unity3d

解决方案


我终于在我的项目中修复了同样的错误。这是我所做的:

  1. 缩小导致 WebGL 崩溃的代码行。 经历确定错误源代码行的痛苦过程。当我按下按钮并尝试在加法模式下加载 UIScene 时,我有这种“运气”。所以起初我在场景中找到了禁用时摆脱崩溃的脚本。然后我重复了这些步骤并深入挖掘了线条。经过 2 小时的构建、评论等,我发现代码不起作用正在为 UnityEngine.UI.Image 设置新颜色。这很奇怪,因为在游戏模式下一切正常。

  2. 寻找解决方案。我认为我的解决方案可能不是通用的,但我认为在运行 WebGL 时 Unity 游戏循环/生命周期中会发生一些事情。问题的根源是我在 Start 方法中设置了存储 UI.Image 的字段,然后在某些函数中我尝试更改颜色。
    财产没有暴露在检查员身上。

    public class ModuleUI : MonoBehaviour
    {
        Image qualityBG;
        void Start()
        {
           qualityBG = GetComponent<Image>();
        }
    ...
    

那么下面的这一行是崩溃的原因

public void Set(Module module)
     {
         ...
         qualityBG.color = module.Quality.ToColor();
    }
  1. 修复- 所以我已将[SerializeField]属性添加到该字段并在 editor 中设置它,将 Image 拖到检查器插槽中。它修复了它。我怀疑 WebGL 构建可能会以不同的顺序执行某些方法,或者可能一起加载的 multipleScene 可能与它有关。我不确定,但该字段未使用以前的 WebGL 构建代码正确设置。

奖励:我还修复了一些不重要的问题(不破坏 WebGL 游戏),但在游戏模式下无法正常工作。这也与尝试在 Start() 方法中设置一些对象然后对它们执行某些操作有关。该集合未在 WebGL 中设置(可能为 null)。

EffectUI[] effects;
Start()
{
    effects = GetComponentsInChildren<EffectUI>();
}
void HideAllEffects()
    {
        if (effects != null)
            for (int i = 0; i < effects.Length; ++i)
                effects[i].gameObject.SetActive(false);
    }

当我将 [SerializeField] 添加到效果并将其连接到场景中时,这也开始起作用了......

希望这会对你们中的一些人有所帮助!


推荐阅读