我正在使用Unity3D制作回合制战斗游戏,有两个场景(城镇场景和战斗场景)。每当角色遇到怪物时,游戏会跳转到战斗场景,在那里进行战斗并在胜利或失败后返回城镇场景。
问题是如何使城镇场景与进入战斗场景时相同的状态返回(包括角色位置、状态等)
如果我使用
Application.LoadLevel('battlescene');
那么
Application.loadLevel('townScene');
然后城镇场景将从第一次开始。如何使城镇场景继续从我们离开的地方开始?
我正在使用Unity3D制作回合制战斗游戏,有两个场景(城镇场景和战斗场景)。每当角色遇到怪物时,游戏会跳转到战斗场景,在那里进行战斗并在胜利或失败后返回城镇场景。
问题是如何使城镇场景与进入战斗场景时相同的状态返回(包括角色位置、状态等)
如果我使用
Application.LoadLevel('battlescene');
那么
Application.loadLevel('townScene');
然后城镇场景将从第一次开始。如何使城镇场景继续从我们离开的地方开始?
我认为你有两种方法可以实现这个功能。这完全取决于你的目标平台以及资源的重要性,但我们来看看:
1)如果资源不是问题
您可以将所有普通场景和战斗场景对象放在一个场景中。
创建两个空游戏对象(一个用于城镇场景对象,另一个用于战斗场景对象)。然后,您可以拥有两个版本的游戏角色或一个版本。接下来编写一个脚本,简单地将相机从城镇场景切换到战斗场景,当触发战斗时,再切换回城镇场景。
如果每个角色只有一个版本,则可以简单地添加一个脚本,将游戏角色控制器的行为更改为战斗模式或普通/城镇模式。
如果每个角色都有两个版本,则只需要编写相应的角色控制器脚本,并根据使用哪个角色激活/停用游戏角色。这就是像《最终幻想7,8,9》之类的游戏实现相同效果的方式。游戏角色有两个版本:一个用于战斗模式,另一个用于普通模式。
2)如果资源是问题 (我认为更有效的方法)
您可以使用Application.LoadLevelAdditive函数。该函数允许您加载不同的场景,并且与其销毁当前场景中的所有内容不同,它将新场景及其所有对象添加到当前场景中。 因此,您可以像这样使用它:
创建一个单独的战斗场景,以及在您的场景中创建一个空游戏对象来容纳场景中的每个对象。
在您的常规场景中进行相同操作。
当需要进入战斗模式时,请使用:
Application.LoadLevelAdditive ('battlescene')。
如果你想在此之后卸载你的战斗场景,你可以编写代码来销毁战斗场景游戏对象,因为它包含了你的战斗场景中的所有内容。
与第一种方法类似,你可以决定是否要有两个不同版本的角色。其中一个优点是,如果你不想详细处理游戏模型(特别是如果你的游戏非常大),你可以使用缩小模型用于城镇场景,并在战斗场景中使用更加精细的模型,假设战斗场景是代表你的角色战斗的小舞台。思考最终幻想VII。这只是一个需要考虑的问题。
希望这能帮到你。我匆忙写了这些内容,如果有什么需要澄清的,请告诉我。
您可以通过c#脚本实现此操作。
void onYourFunction()
{
Time.timeScale = 0; //pauses the current scene
Application.LoadLevelAdditive("YourNextScene"); //loads your desired other scene
}
当您想要重新激活游戏时,您可以使用Time.timeScale = 1;
我知道这是一个古老的帖子,不过还有一种方法可以使用。那就是保存场景的状态。当你不希望用户通过Application.LoadLevelAdditive加载两个场景时,它会非常有用,该方法可能会使用两倍的资源。
当你保存状态(保存所有可能更改的信息到文件或数据库)后,你可以在以后的时间点加载该级别而不必将其保留在内存中。你也可以使用此方法来保存游戏。
SaveSceneState()
和 RestoreSceneState()
函数,但我认为这些函数在 Unity 中默认并不存在。 - Thomas我知道这是一篇旧帖子。但是我已经找到了另一个非常简单的解决方案适用于我的情况。只需在一个场景中停用所有游戏对象,同时激活另一个场景,然后在返回根场景时重新激活它:
[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);
}
}