我正在尝试制作一个 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/