使用 DontDestroyOnLoad Unity C# 在场景之间保存对象

Save object between scenes using DontDestroyOnLoad Unity C#

我正在制作一个 2D 游戏,我的角色可以在不同的房间进出,所以由于每个房间都是不同的场景,我需要能够以某种方式让我的角色贯穿每个场景,为此目的团结提供 DontDestroyOnLoad() 因此,每当我切换场景时,我确实使用了该功能,但是这有一个问题。

假设我的房间只有 2 个,而且看起来很简单

在此方案中,主房间是您开始游戏的房间,它包含已生成的角色预制件。一旦我们去到第二个房间,我的角色就​​和他所有的好东西一起被保存了,但是如果我们回到主 scene/room,我们现在可以看到 2 个角色。为什么 ?因为当加载不同的场景时,我们的初始角色不会被破坏,而且我们还有一个与 Main room/scene 一起创建的角色。现在这真的很糟糕,我不知道如何解决这个问题,我在每个场景中都需要的一些脚本也有同样的问题。任何帮助表示赞赏。

通常的解决方案是不要在可以多次查看的场景中创建设置为 DontDestroyOnLoad 的对象。

大多数人所做的是创建一个预加载场景,这是第一个加载游戏的场景,创建所有在场景之间存活的对象,然后该预加载场景加载 "Main game scene"。

如果您不想要预加载场景,那么您的游戏对象需要检查 Awake 是否已经存在该游戏对象的另一个实例。如果它确实找到了一个实例,那么它需要销毁自己。第一个实例不会找到任何其他实例,因此它不会被销毁,但所有未来的实例都会被销毁。

您可以通过脚本在主场景中生成角色 - 对其进行实例化。确保你给角色预制一个特定的标签(例如"Player")。

然后在 if 语句中实例化角色。使用 FindGameObjectWithTag(<Tag>) == null 您可以查明角色是否已经创建。

public GameObject player;

if(GameObject.FindGameObjectWithTag("Player") == null){
   player = Instantiate(prefab,position,rotation) as GameObject;
}