示例#1
0
        public static void RemoveComponent([DisallowNull] Component comp)
        {
            var dependencies = RemoveComponentUtils.ComponentDependencies(comp);

            if (!RemoveComponent(comp, dependencies))
            {
                //preserve built-in behavior
                if (RemoveComponentUtils.CanRemoveComponent(comp, dependencies))
                {
                    Undo.DestroyObjectImmediate(comp);
                }
            }
        }
        internal static void RemoveAdditionalDataComponent([DisallowNull] Component additionalDataComponent, [DisallowNull] List <Type> componentsTypeToRemove)
        {
            using (ListPool <Component> .Get(out var components))
            {
                // Fetch all components
                foreach (var type in componentsTypeToRemove)
                {
                    components.AddRange(additionalDataComponent.GetComponents(type));
                }

                // Remove all of them
                foreach (var mono in components)
                {
                    RemoveComponentUtils.RemoveComponent(mono);
                }
            }
        }
示例#3
0
        public static bool RemoveComponent([DisallowNull] Component component, IEnumerable <Component> dependencies)
        {
            var additionalDatas = dependencies
                                  .Where(c => c != component && c is IAdditionalData)
                                  .ToList();

            if (!RemoveComponentUtils.CanRemoveComponent(component, dependencies.Where(c => !additionalDatas.Contains(c))))
            {
                return(false);
            }

            bool removed        = true;
            var  isAssetEditing = EditorUtility.IsPersistent(component);

            try
            {
                if (isAssetEditing)
                {
                    AssetDatabase.StartAssetEditing();
                }
                Undo.SetCurrentGroupName($"Remove {component.GetType()} and additional data components");

                // The components with RequireComponent(typeof(T)) also contain the AdditionalData attribute, proceed with the remove
                foreach (var additionalDataComponent in additionalDatas)
                {
                    if (additionalDataComponent != null)
                    {
                        Undo.DestroyObjectImmediate(additionalDataComponent);
                    }
                }
                Undo.DestroyObjectImmediate(component);
            }
            catch
            {
                removed = false;
            }
            finally
            {
                if (isAssetEditing)
                {
                    AssetDatabase.StopAssetEditing();
                }
            }

            return(removed);
        }
 static void RemoveComponentWithAdditionalData(MenuCommand command)
 {
     RemoveComponentUtils.RemoveComponent(command.context as Component);
 }