加载新场景时如何销毁标记为“DontDestroyOnLoad”的游戏对象?

Posted

技术标签:

【中文标题】加载新场景时如何销毁标记为“DontDestroyOnLoad”的游戏对象?【英文标题】:How to destroy a game object marked "DontDestroyOnLoad" when a new scene loads? 【发布时间】:2015-12-02 06:02:21 【问题描述】:

所以我创建了一个音乐播放器来播放我所有的菜单和故事场景中的音乐而不会被打断,但是在我的游戏场景中我想删除那些音乐。我的游戏场景加载时如何破坏正在播放的音乐?

这是我的音乐脚本:

#pragma strict

var offsetY : float = 40;
var sizeX : float = 100;
var sizeY : float = 40;

var musicPrefab : Transform;

function Start () 

if (!GameObject.FindGameObjectWithTag("MM")) 
    var mManager = Instantiate (musicPrefab, transform.position, Quaternion.identity);
    mManager.name = musicPrefab.name;
    DontDestroyOnLoad (mManager);


【问题讨论】:

【参考方案1】:

直接调用destroy即可:

Destroy(mManager);

DontDestroyOnLoad 仅在加载新场景时保护对象不被破坏。

【讨论】:

谢谢!我会把 Destroy(mManager); 放在哪里?我试着把它放在我的 playercontroller.cs 中没有做任何事情。当我把它放到另一个 .js 脚本中时,它说“未知标识符”。有任何想法吗? :// 您需要在某个地方保留对 mManager 的引用,以便在您需要销毁它时脚本可以访问它。我不知道你的项目和代码的结构,所以我无法知道你需要把它放在哪里或确切地如何设置它。【参考方案2】:

我创建了一个名为 Destroyer.js 的脚本,并将它附加到我不需要音乐的场景中的摄像机上。然后在那个脚本中我添加了这段代码,它不再播放了。

function Start() 

Destroy(gameObject.Find("_MMusic"));

【讨论】:

【参考方案3】:

您可以通过调用 Destroy(objectname) 直接销毁对象,就像上面 Almo 提到的那样。您可以将它放在同一个函数调用中,该函数调用负责更改您不希望播放音乐的场景。

【讨论】:

【参考方案4】:

我遇到了同样的问题,所以我尝试了上面答案中提到的Destroy(gameObject);,但它对我不起作用。

所以我尝试了SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);,它对我有用。阅读官方文档here。

【讨论】:

【参考方案5】:

也许有点晚了,但我使用了这个脚本,效果很好:

GameObject player = GameObject.FindGameObjectWithTag("Player");
if(player)
 Destroy(player);

【讨论】:

【参考方案6】:

为此,只需将Destroy(gameObject) 放入Update 方法中即可。

【讨论】:

这个答案和more well recieved answers一模一样。因此它应该被删除。

以上是关于加载新场景时如何销毁标记为“DontDestroyOnLoad”的游戏对象?的主要内容,如果未能解决你的问题,请参考以下文章

何时以及如何将 java 类加载器标记为垃圾收集?

删除旧地图标记并加载新标记? [复制]

Unity Photon Network CustomPropeties 在加载新场景后未更新

Kinect帮助文档翻译之三 多场景

U3D 场景切换时 脚本对象,GO对象,资源对象的问题

在Dijit销毁小部件