在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?

Posted

技术标签:

【中文标题】在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?【英文标题】:In Unity, how to delete a component via script when deleting another component via the editor? 【发布时间】:2021-11-01 12:35:57 【问题描述】:

上下文:我正在编辑一个预制件,上面有两个组件,都是自定义脚本。

编辑预制件时,我想在删除组件容器同步的同时删除编辑器中的组件容器描述符,方法是右键单击它并单击删除组件。见下图。

在 ContainerDescriptor 中,我参考了 ContainerSync 脚本。

 public class ContainerDescriptor : MonoBehaviour
 
     public ContainerSync containerSync;
 

我尝试使用 ContainerDescriptor 脚本的 OnDestroy() 方法,但是以这种方式删除 ContainerDescriptor 时不会调用它。

【问题讨论】:

【参考方案1】:

On this thread 至少有一个解决方案,如果您像您一样通过上下文菜单删除该组件。

使用[ExecuteAlways],通常仅在 PlayMode 中调用的事件消息调用也会在 Edit 和 Prefab 模式中调用!

你可以做类似的事情,例如

[ExecuteAlways]
public class ContainerDescriptor : MonoBehaviour

     public ContainerSync containerSync;

#if UNITY_EDITOR
     private void OnDestroy ()
     
         if(containerSync)
         
             if(Application.isPlaying)
                 Destroy(containerSync);
             else
                 DestroyImmediate (containerSync);
         
     
#endif

请注意,尽管专门针对预制件,这可能仍然会失败,因为 afaik 既不能在预制件内部使用 Destroy 也不能使用 DestroyImmediate(请参阅 here)

【讨论】:

它似乎也适用于预制件,至少 DestroyImmediate 可以。

以上是关于在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D防止添加某些内置组件

Unity插件扩展中组件常用的几个方法

如何用unity3D编辑英雄技能冷切框

unity怎么把一个镜头下的多个脚本一次性复制给另一个镜头?右键弹出的复制功能只能单个复制!

unity布局无法删除

Unity 编辑器中移除组件