unity3d 在Unity中,当我在编辑器中删除一个组件时,如何删除多个组件?

vuktfyat  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(301)

我有一个叫做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。

bbuxkriu

bbuxkriu1#

检查一下你要销毁的物体是否已经销毁了可能会有帮助?

else
        {
           if(attachedContainer!=null) 
           {
               DestroyImmediate(attachedContainer, true);
           }
        }

请注意,我还没有测试上面的代码。我希望你明白这一点。

7uzetpgm

7uzetpgm2#

使用自定义编辑器就可以做到这一点。我在自定义编辑器脚本中将我想删除的每个组件声明为引用。我将containerDescriptor中的引用分配给containerDescriptorEditor中的引用。然后我使用自定义编辑器的onDestroy:
在containerDescriptorEditor.cs中:

public class ContainerDescriptorEditor : Editor
{
    private ContainerDescriptor containerDescriptor;
    private AttachedContainer attachedContainer;
    private AttachedContainerGenerator attachedContainerGenerator;  
    private ContainerInteractive containerInteractive;
    private VisibleContainer visibleContainer;

    // ... some code

    public void OnEnable()
    { 
        containerDescriptor = (ContainerDescriptor)target;
        attachedContainer = containerDescriptor.attachedContainer;  
        containerInteractive = containerDescriptor.containerInteractive;
        visibleContainer = containerDescriptor.visibleContainer;     
    } 

    // ... some more code

    private void OnDestroy()
    {
        if(containerDescriptor == null)
        {
            RemoveContainer();
        }
    }

    private void RemoveContainer()
    {
        DestroyImmediate(attachedContainer, true);
        DestroyImmediate(attachedContainerGenerator, true);
        DestroyImmediate(containerInteractive, true);
        DestroyImmediate(visibleContainer, true);
    }

// ...
}

这对我有用。

f3temu5u

f3temu5u3#

下面是我为解决该问题而编写的脚本。
https://github.com/saadasghar96/Unity/blob/master/Utility/MultiComponentCopierCleaner.cs
进入Earth People Studio〉多组分清洁剂
如果您在Multi-Component Cleaner中将“component”字段留空,它将删除所有类型的组件。键入“rigidbody”(只要组件的部分名称正确, shell 就不重要),脚本将执行其余操作。
确保备份您正在清理的对象,以防出现问题。

相关问题