我正在尝试制作一个2D RPG游戏,其中包含很多我不使用的脚本notdestroyonload脚本。但是当我返回主菜单时,我想销毁它。

我已经尝试过此脚本

SceneManager.activeSceneChanged += DestroyOnMenuScreen;

private void DestroyOnMenuScreen(Scene oldScene, Scene newScene)
{
    if (newScene.buildIndex == menuScreenBuildIndex)
    {
        Destroy(gameObject);
    }
}


因此,这意味着当我移至主菜单时“不要破坏”对象将被破坏,但问题是当我想再次播放时,它将向我显示它找不到找到已被破坏的对象完全。

当我再次加载游戏时,是否有办法确保对象像以前一样返回?我尝试使用gameObject.setActive(false);,但是当我死亡并再次加载游戏时,它仍处于游戏结束状态。

最佳答案

假设您的场景如下:


Menu =>包含Menu对象
Scene1 =>包含Manager对象
场景2
场景3


您希望DontDestroyOnLoad在Scene1和Scene2 / 3上工作,但在菜单上删除。
导航使您始终从菜单移至Scene1。

将您的DontDestroyOnLoad对象放在Scene1中。

然后在Menu中进行销毁过程:

public class Menu : MonoBehaviour
{
    private void Start()
    {
        Destroy(FindObjectOfType<Manager>());
    }
}

public class Manager : MonoBehaviour
{
      private static Manager instance = null;

      private void Awake()
      {
          if (instance == null)
          {
               instance = this;
               DontDestroyOnLoad(gameObject);
               return;
          }
          if (instance == this) return;
          Destroy(gameObject);
      }
}


您的经理需要一个单例样式模式。当返回到Scene1时,将添加该对象的新实例,并且需要确保原来的实例保留下来,但新实例被删除。

Main类将检查是否可以找到Manager。第一次运行时,除了播放过程中什么都没有发生,如果您返回菜单,则找到并删除了管理员。下次返回到Scene1时,将创建一个新的Manager,因为它是场景的一部分。

10-02 21:49