13

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

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

如果我使用

Application.LoadLevel('battlescene');

然后

Application.loadLevel('townScene');

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

4

4 回答 4

16

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

1) 如果资源不是问题

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

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

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

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

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

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

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

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

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

    Application.LoadLevelAdditive('battlescene');

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

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

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

于 2012-11-21T06:10:22.967 回答
4

您可以通过 C# 中的脚本来完成

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

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

于 2014-08-29T07:38:13.133 回答
2

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

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

于 2014-07-22T18:27:19.650 回答
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);
        }
    }
于 2021-05-25T16:54:14.353 回答