【问题标题】:unity moving to another scene with current scene being paused统一移动到另一个场景,当前场景被暂停
【发布时间】:2012-11-09 07:48:12
【问题描述】:

我正在 Unity3D 中制作回合制战斗游戏,我有 2 个场景(城镇场景和战斗场景)。每当角色遇到怪物时,游戏会跳转到角色进行战斗的战斗场景,并在击败或失败后返回城镇场景。

问题是如何以与角色进入战斗场景时相同的状态(角色位置、状态等)返回城镇场景

如果我使用

Application.LoadLevel('battlescene');

然后

Application.loadLevel('townScene');

那么城镇场景将从第一次开始。如何让城镇场景从我们中断的地方继续?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    我认为有两种方法可以实现这一点。这完全取决于您的目标平台以及资源的重要性,但我们开始吧:

    1) 如果资源不是问题

    您可以将所有普通场景和战斗场景对象放在一个场景中。

    • 创建两个空的游戏对象(一个用于城镇场景对象,另一个用于战斗场景对象)。然后你可以有两个版本 您的游戏角色或一个。然后写一个简单的脚本 将摄像机从城镇场景切换到战斗场景 战斗结束时触发战斗并返回城镇场景 结束了。

    • 如果每个角色都有一个版本,您可以简单地添加一个脚本来更改游戏角色控制器的行为 往返战斗模式和普通/城镇模式。

    • 如果每个角色有两个版本,那么您只需要编写适当的角色控制器脚本和 根据您的身份激活/停用游戏角色 使用。这就是最终幻想 7、8、9 等游戏实现相同目标的方式 影响。游戏角色有两种版本:一种是战斗模式,另一种是普通模式。

    2) 如果资源是个问题 (而且我认为是一种更有效的方法)

    您可以使用Application.LoadLevelAdditive 函数。此功能允许您加载不同的场景,而不是破坏当前场景中的所有内容,而是获取新场景及其所有对象并将它们添加到当前场景中。 所以基本上你可以像这样使用它:

    • 创建一个单独的战斗场景并在您的场景中创建一个空的游戏对象来保存您场景中的每个对象。

    • 在你的普通场景中做同样的事情。

    • 当你需要进入战斗模式时使用:

      Application.LoadLevelAdditive('battlescene');

    • 当/如果你想在之后卸载你的战斗场景,你可以通过简单地编写代码来销毁战斗场景游戏对象来做到这一点 因为它包含了你战斗场景的所有内容。

    与第一种方法一样,您可以决定是否要拥有两个不同版本的角色。拥有两个版本的优点之一是,如果您想通过不详细介绍游戏模型来节省时间(特别是如果您的游戏非常大),您可以通过使用缩小的城镇场景模型来节省处理能力,并且使用更精细的战斗场景模型,假设你的战斗场景是一个小舞台,代表你的角色战斗的地方。想想最终幻想VII。只是需要考虑的事情。

    我希望这会有所帮助。我写的很匆忙,但如果有什么需要清理的话,请让我知道。

    【讨论】:

    • 没问题,希望一切顺利。如果您需要额外帮助,请大声喊叫。
    【解决方案2】:

    你可以通过c#中的脚本来实现

    void onYourFunction()
    {
        Time.timeScale = 0; //pauses the current scene 
        Application.LoadLevelAdditive("YourNextScene"); //loads your desired other scene
    }
    

    当你想重新激活你的游戏时,你可以使用 Time.timeScale = 1;

    【讨论】:

      【解决方案3】:

      我知道这是一篇旧帖子,但还有另一种方法可以使用。这将是为了保存场景的状态。当您不希望用户拥有使用 Application.LoadLevelAdditive 加载 2 个场景的资源时,这会派上用场。该方法可能会使用两倍的资源。

      当您保存状态(保存所有可以更改到文件或数据库的信息)时,您可以稍后加载关卡,而不是将其放在内存中。您也可以使用它来保存游戏。

      【讨论】:

      • 您能否添加有关如何保存场景状态的信息?您的回答意味着存在预先存在的 SaveSceneState()RestoreSceneState() 函数,我认为默认情况下 Unity 中不存在这些函数。
      【解决方案4】:

      我知道它在旧帖子上。但是我为我的情况找到了另一个非常简单的解决方案。只需在另一个场景处于活动状态时停用一个场景中的所有游戏对象,然后再重新激活它,我就会回到根场景:

      [Button]
          public void UnPauseScene()
          {
              EndlessSceneCamera.gameObject.SetActive(true);
              Time.timeScale = 1;
              levelStatus = LevelStatus.Running;
      
              foreach (var go in activeGameObjectsBeforeScenePaused)
              {
                  go.SetActive(true);
              }
          }
      
          [Button]
          public void PauseScene()
          {
              //EndlessSceneCamera.gameObject.SetActive(false);
              levelStatus = LevelStatus.Pause;
              Time.timeScale = 0;
      
              var allGameObjects = FindObjectsOfType<GameObject>().ToList();
              activeGameObjectsBeforeScenePaused = allGameObjects.Where(x => isActiveAndEnabled).ToList();
              foreach (var go in activeGameObjectsBeforeScenePaused)
              {
                  go.SetActive(false);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多