【问题标题】:Unity Application.LoadLevel freezes the game on Android deviceUnity Application.LoadLevel 冻结 Android 设备上的游戏
【发布时间】:2015-11-19 15:40:53
【问题描述】:

我正在使用 Unity 开发游戏。游戏只有一个关卡,玩家赢/输后,我只想重新加载相同的场景。这是我正在使用的代码:

private void OnLevelFailed()
{
    IsGameStarted = false;
    Debug.Log("LEVEL FAILED");
    Invoke("RestartLevel",5);
}

void RestartLevel()
{
    Application.LoadLevel(Application.loadedLevelName);
}

在编辑器上运行此代码时,一切似乎都很好,并且场景按预期重新加载。但是,当我为 Android 构建游戏并在设备(LG G3)上运行它时,游戏只是冻结了。我使用adb logcat 查看任何异常或错误的日志,如果有任何异常或错误但没有运气。我还怀疑Invoke 调用是否导致了问题,并将其替换为简单的方法调用,但这也没有解决问题。

有人知道为什么会发生这种情况吗?

编辑:问题似乎是由我正在使用的预制件引起的,即ALPSVR。它是一个虚拟现实 SDK,允许您拥有独立于 Unity 自己的 VR 实现(支持一些 VR 设备和 GearVR,但不支持常规 Android 设备)的 VR 相机。

我尝试在重新加载之前从场景中销毁 VR 摄像机,但它再次没有解决问题。为什么场景中的某个 GameObject 会阻止 Application.LoadLevel 正常工作?

【问题讨论】:

  • 你的 Time.timeScale = 0 吗?
  • 如果您使用 Unit 4.x,则需要 Unity Pro,否则 ALPSVR 将无法工作。
  • @JeanLuc,我还没有在游戏中的任何地方碰过时间刻度。这会导致问题吗?
  • @Puneet 我正在使用 Unity 5.1。
  • 是的,如果 timeScale 为 0,则 5 秒实际上永远不会过去,并且您的方法 RestartLevel 未被调用

标签: c# android unity3d


【解决方案1】:

您可能会成功使用Application.LoadLevelAsync(Application.loadedLevelName);

如果这不起作用,请考虑创建第二个空白场景。当你的游戏关卡完成后,调用Application.LoadLevel(Application.blankScene);,然后将这个脚本放在那个空白场景中的游戏对象上:

public class LevelLoader : MonoBehaviour
    {
      void Start()
      {
        StartCoroutine(ReloadLevel());
      }

      IEnumerator ReloadLevel()
      {
        yield return Resources.UnloadUnusedAssets();
        Application.LoadLevel(Application.loadedLevelName);
      }

【讨论】:

  • 不幸的是,这不起作用。看来我也无法加载任何其他场景。但是,如果我从另一个场景开始并使用您的代码加载我的主场景,它就可以工作。我的主要场景一定有问题,但我不知道是什么。
  • 如果你从那个空白场景开始然后加载你的主场景,在你的关卡结束并且你再次进入空白>主场景后它仍然有效吗?如果是这样,那实际上可能是一个合适的解决方案。通常你会这样做,因为你需要一个菜单​​场景。所以去菜单>主要>空白>主要>空白>主要等
  • 不,它没有。我无法从主场景导航到任何其他场景。您可以在上面查看我的编辑,了解我发现的有关该问题的更多信息。
猜你喜欢
  • 2018-03-30
  • 1970-01-01
  • 2022-10-11
  • 2020-01-17
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多