【问题标题】:Don't destroy on load不要在加载时破坏
【发布时间】:2018-06-05 16:27:03
【问题描述】:

我正在尝试制作一个 2D RPG 游戏,它有很多我使用的对象 don'tdestroyonload 脚本。但是当我返回主菜单时,我想销毁它。

我试过这个脚本

SceneManager.activeSceneChanged += DestroyOnMenuScreen;

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

这意味着当我移动到主菜单时,加载时不破坏对象将被破坏,但问题是当我想再次播放时,它会告诉我它找不到意味着它的对象已被彻底摧毁。

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

【问题讨论】:

    标签: c# android unity3d


    【解决方案1】:

    假设您有以下场景:

    • 菜单 => 包含菜单对象
    • Scene1 => 包含管理器对象
    • 场景2
    • 场景3

    您希望 DontDestroyOnLoad 在 Scene1 和 Scene2/3 上工作,但在 Menu 上被删除。 导航是这样的,您总是从 Menu 移动到 Scene1。

    在 Scene1 中有您的 DontDestroyOnLoad 对象。

    然后在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,因为它是场景的一部分。

    【讨论】:

    • 感谢您的帮助:3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2017-08-19
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多