我有一个叫做ContainerDescriptor的组件。当我通过右键单击然后左键单击删除组件来删除它时,我希望它也删除脚本中引用的其他组件。
我目前在ContainerDescriptor.cs中使用OnDestroy()。我还使用[ExecuteAlways]属性,因此OnDestroy()也在编辑器模式中调用。
假设我有一个对另一个名为attachedContainer的组件的引用,我想在销毁containerDescriptor时删除它。
在容器描述符. cs中:
[ExecuteAlways]
public class ContainerDescriptor : MonoBehaviour
{
// ... some code
public AttachedContainer attachedContainer;
private void OnDestroy()
{
if (Application.isPlaying)
{
Destroy(attachedContainer);
}
else
{
DestroyImmediate(attachedContainer, true);
}
}
// ... some more code
}
它在编辑器模式下运行良好,但当我按下播放时,每次都会得到以下错误:
多次销毁对象。不要在OnDisable或OnDestroy中对同一对象使用DestroyImmediate。
但是Destroy()只在播放模式下有效!所以我不知道还有哪些选项留给我。
理想情况下,我可以通过在其他地方调用DestroyImmediate()来删除这些组件,在编辑器中选择删除组件时调用的某个方法OnRemoveComponent中,但我在文档中找不到类似的内容。
如果这是相关的,我用的是Unity 2019.3。
3条答案
按热度按时间bbuxkriu1#
检查一下你要销毁的物体是否已经销毁了可能会有帮助?
请注意,我还没有测试上面的代码。我希望你明白这一点。
7uzetpgm2#
使用自定义编辑器就可以做到这一点。我在自定义编辑器脚本中将我想删除的每个组件声明为引用。我将containerDescriptor中的引用分配给containerDescriptorEditor中的引用。然后我使用自定义编辑器的onDestroy:
在containerDescriptorEditor.cs中:
这对我有用。
f3temu5u3#
下面是我为解决该问题而编写的脚本。
https://github.com/saadasghar96/Unity/blob/master/Utility/MultiComponentCopierCleaner.cs
进入Earth People Studio〉多组分清洁剂
如果您在Multi-Component Cleaner中将“component”字段留空,它将删除所有类型的组件。键入“rigidbody”(只要组件的部分名称正确, shell 就不重要),脚本将执行其余操作。
确保备份您正在清理的对象,以防出现问题。