【发布时间】:2016-05-03 05:51:13
【问题描述】:
这是一个我一直在努力回答的非常具体的问题。我有一个简单的脚本,可以在运行时唤醒/销毁期间创建/销毁组件:
// Simple script that creates and destroys an AudioSource component in runtime.
public class SimpleScript : MonoBehaviour {
// Runtime AudioSource component to be used.
private AudioSource source = null;
void Awake() {
source = gameObject.AddComponent<AudioSource>();
source.hideFlags = HideFlags.HideAndDontSave;
}
void OnDestroy() {
Destroy(source);
}
void Update() {
// Do stuff with |source| . . .
}
}
它在构建导出和所有东西上都可以正常工作,但是,我最近注意到一个非常特殊的情况,Unity 的行为有点奇怪。在 Unity 编辑器(播放模式)中,如果我删除此脚本(或脚本附加到的游戏对象),然后撤消该操作,则会导致两个 AudioSources 附加到复活的游戏对象。进一步来说;一个由我的脚本先前使用删除操作销毁+ 一个使用新的Awake 调用创建。正如预期的那样,重复执行此操作会产生越来越多的泄露组件。
使用不同的HideFlags 来禁用(?)序列化似乎没有任何好处,也没有尝试使用DestroyImmediate 等来破坏组件。我在这里的理解是,Unity 将手动创建的组件视为GameObject 的组件之一,因此在撤消脚本删除的同时注册销毁并撤消它。
关于如何绕过/避免 Unity 这种奇怪行为的任何建议?
干杯!
【问题讨论】:
-
如果您要重新创建游戏对象,为什么不禁用并重新启用它?
-
这里的问题是你一开始没有这个组件,也就是说,你必须在脚本的某个地方创建它,以便你可以启用/禁用它。 :)
标签: c# unity3d editor undo-redo