c# - 不要破坏负载

标签 c# android unity3d

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

我试过这个脚本

SceneManager.activeSceneChanged += DestroyOnMenuScreen;

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

所以这意味着当我移动到主菜单时,加载时不销毁对象将被销毁,但问题是当我想再次播放时,它会告诉我它找不到对象,这意味着它已经完全销毁。

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

最佳答案

假设您有以下场景:

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

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

在 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 时,将添加该对象的一个​​新实例,您需要确保保留原始实例,但删除新实例。

主类将检查是否可以找到管理器。第一次运行时,没有任何反应,但在游戏过程中,如果您返回菜单,则会找到并删除管理器。下次您返回场景 1 时,会创建一个新的管理器,因为它是场景的一部分。

关于c# - 不要破坏负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47951297/

相关文章:

c# - Entity Framework 映射 fluent api 单独的实体映射

c# - 当 DataGrid 嵌套在分组的 DataGrid 中时,相对列宽不起作用

c# - 如何在 C# 中将 WindowsInstaller.Record 转换为 System.Data.Dataset 或数据表(在读取 MSI 文件时)

android - 禁用应用程序中特定 Activity 的权限

c# - 将 List<string> 中的元素转换为 C# 中的 List<Texture> (Unity3d)

c# - C#中基于向导控件的ActiveStepIndex修改QueryString

android - 如何在折线图中添加目标线 - AChartEngine

android - 改造:@Field 和 @Body 有什么不同

android - Android IAP在测试过程中找不到项目

c# - foreach循环Unity3D C#中的协程