我正在Unity3D制作一个回合制的战斗游戏,我有2个场景(城镇场景和战斗场景)。每当角色遇到一个怪物时,游戏就会跳到角色战斗的战斗场景,并在击败或失败后返回城镇场景。
问题是如何以与角色进入战斗场景时相同的状态(角色位置,状态等)返回城镇场景
如果我使用
Application.LoadLevel('battlescene');
然后
Application.loadLevel('townScene');
然后,城镇将从第一次开始。如何使城镇继续从我们离开的地方继续?
答案 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);
}
}