Unity切换场景时如何暂停当前场景?

14

我正在使用Unity3D制作回合制战斗游戏,有两个场景(城镇场景和战斗场景)。每当角色遇到怪物时,游戏会跳转到战斗场景,在那里进行战斗并在胜利或失败后返回城镇场景。

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

如果我使用

Application.LoadLevel('battlescene');

那么

Application.loadLevel('townScene');

然后城镇场景将从第一次开始。如何使城镇场景继续从我们离开的地方开始?

4个回答

16

我认为你有两种方法可以实现这个功能。这完全取决于你的目标平台以及资源的重要性,但我们来看看:

1)如果资源不是问题

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

  
        
  • 创建两个空游戏对象(一个用于城镇场景对象,另一个用于战斗场景对象)。然后,您可以拥有两个版本的游戏角色或一个版本。接下来编写一个脚本,简单地将相机从城镇场景切换到战斗场景,当触发战斗时,再切换回城镇场景。

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

  •     
  • 如果每个角色都有两个版本,则只需要编写相应的角色控制器脚本,并根据使用哪个角色激活/停用游戏角色。这就是像《最终幻想7,8,9》之类的游戏实现相同效果的方式。游戏角色有两个版本:一个用于战斗模式,另一个用于普通模式。

  •   

2)如果资源是问题 (我认为更有效的方法)

您可以使用Application.LoadLevelAdditive函数。该函数允许您加载不同的场景,并且与其销毁当前场景中的所有内容不同,它将新场景及其所有对象添加到当前场景中。 因此,您可以像这样使用它:

  
        
  • 创建一个单独的战斗场景,以及在您的场景中创建一个空游戏对象来容纳场景中的每个对象。

  •     
  • 在您的常规场景中进行相同操作。

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

    Application.LoadLevelAdditive ('battlescene')。

    如果你想在此之后卸载你的战斗场景,你可以编写代码来销毁战斗场景游戏对象,因为它包含了你的战斗场景中的所有内容。

    与第一种方法类似,你可以决定是否要有两个不同版本的角色。其中一个优点是,如果你不想详细处理游戏模型(特别是如果你的游戏非常大),你可以使用缩小模型用于城镇场景,并在战斗场景中使用更加精细的模型,假设战斗场景是代表你的角色战斗的小舞台。思考最终幻想VII。这只是一个需要考虑的问题。

    希望这能帮到你。我匆忙写了这些内容,如果有什么需要澄清的,请告诉我。


没问题,希望一切顺利。如果需要额外的帮助,请喊一声。 - amasiye

4

您可以通过c#脚本实现此操作。

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

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


2

我知道这是一个古老的帖子,不过还有一种方法可以使用。那就是保存场景的状态。当你不希望用户通过Application.LoadLevelAdditive加载两个场景时,它会非常有用,该方法可能会使用两倍的资源。

当你保存状态(保存所有可能更改的信息到文件或数据库)后,你可以在以后的时间点加载该级别而不必将其保留在内存中。你也可以使用此方法来保存游戏。


1
请问您能否添加关于如何保存场景状态的信息?您的回答暗示了预先存在 SaveSceneState()RestoreSceneState() 函数,但我认为这些函数在 Unity 中默认并不存在。 - Thomas

0

我知道这是一篇旧帖子。但是我已经找到了另一个非常简单的解决方案适用于我的情况。只需在一个场景中停用所有游戏对象,同时激活另一个场景,然后在返回根场景时重新激活它:

[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);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接