В Unity, как удалить компонент с помощью скрипта при удалении другого компонента через редактор?

#unity3d #user-interface #editor

Вопрос:

Контекст : Я редактирую сборный проект, у меня есть два компонента, оба являются пользовательскими сценариями.

При редактировании сборного модуля я хочу удалить синхронизацию контейнера компонентов одновременно с удалением дескриптора контейнера компонентов в редакторе, щелкнув его правой кнопкой мыши и нажав «Удалить компонент». Смотрите картинку ниже.

компоненты, которые я хочу удалить

В ContainerDescriptor у меня есть ссылка на сценарий ContainerSync.

  public class ContainerDescriptor : MonoBehaviour
 {
     public ContainerSync containerSync;
 }
 

Я попытался использовать метод onDestroy() скрипта ContainerDescriptor, но он не вызывается при удалении ContainerDescriptor таким образом.

Ответ №1:

В этой теме есть решение, по крайней мере, для того, чтобы удалить этот компонент через контекстное меню, как вы это делаете.

Используя [ExecuteAlways] сообщения о событиях, вызовы, которые обычно вызываются только в режиме воспроизведения, также вызываются в режиме редактирования и в сборном режиме!

Вы можете сделать что-то вроде, например

 [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 может использоваться внутри сборных модулей (см. Здесь).

Комментарии:

1. Похоже, это работает и для сборных домов, по крайней мере, DestroyImmediate.