当前场景暂停时,团结移动到另一个场景

时间:2012-11-21 05:21:50

标签: unity3d

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

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

如果我使用

Application.LoadLevel('battlescene');

然后

Application.loadLevel('townScene');
然后,城镇将从第一次开始。如何使城镇继续从我们离开的地方继续?

4 个答案:

答案 0 :(得分:15)

我认为有两种方法可以实现这一目标。这一切都取决于您的目标平台以及资源的重要性,但我们将继续:

1)如果资源不是问题

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

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

  •   
  • 如果每个角色都有一个版本,则只需添加一个脚本即可更改游戏角色控制器的行为   进入战斗模式和正常/城镇模式。

  •   
  • 如果你有两个版本的每个字符,那么你只需要编写适当的字符控制器脚本和   根据您的身份激活/停用游戏角色   使用。这就是最终幻想7,8,9这样的游戏达到了同样的效果   影响。有两个版本的游戏角色:一个用于战斗模式,另一个用于普通模式。

  •   

2)如果资源有问题 (我认为这是一种更有效的方式)

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

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

  •   
  • 在你的noraml场景中也一样。

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

         

    Application.LoadLevelAdditive('battlescene');

  •   
  • 当你想要卸下你的battlescene之后,你可以通过简单地编写代码来破坏battlescene游戏对象   因为它包含了战斗场景中的所有内容。

  •   

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

我希望有所帮助。我已经热情地写下了这一切,但知道是否需要清理。

答案 1 :(得分:4)

您可以通过c#

中的脚本来完成
void onYourFunction()
{
    Time.timeScale = 0; //pauses the current scene 
    Application.LoadLevelAdditive("YourNextScene"); //loads your desired other scene
}

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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);
        }
    }