/// <summary>Detects orphaned parts renderers and offers to delete them.</summary>
        public void DetectOrphanedPartsRenderers(SkeletonRenderSeparator component)
        {
            var children = component.GetComponentsInChildren <SkeletonPartsRenderer>();

            var orphans = new System.Collections.Generic.List <SkeletonPartsRenderer>();

            foreach (var r in children)
            {
                if (!component.partsRenderers.Contains(r))
                {
                    orphans.Add(r);
                }
            }

            if (orphans.Count > 0)
            {
                if (EditorUtility.DisplayDialog("Destroy Submesh Renderers", "Unassigned renderers were found. Do you want to delete them? (These may belong to another Render Separator in the same hierarchy. If you don't have another Render Separator component in the children of this GameObject, it's likely safe to delete. Warning: This operation cannot be undone.)", "Delete", "Cancel"))
                {
                    foreach (var o in orphans)
                    {
                        Undo.DestroyObjectImmediate(o.gameObject);
                    }
                }
            }
        }
Пример #2
0
        public void AddPartsRenderer(SkeletonRenderSeparator component, int count)
        {
            var  componentRenderers = component.partsRenderers;
            bool emptyFound         = componentRenderers.Contains(null);

            if (emptyFound)
            {
                bool userClearEntries = EditorUtility.DisplayDialog("Empty entries found", "Null entries found. Do you want to remove null entries before adding the new renderer? ", "Clear Empty Entries", "Don't Clear");
                if (userClearEntries)
                {
                    componentRenderers.RemoveAll(x => x == null);
                }
            }

            Undo.RegisterCompleteObjectUndo(component, "Add Parts Renderers");
            for (int i = 0; i < count; i++)
            {
                int index = componentRenderers.Count;
                var smr   = SkeletonPartsRenderer.NewPartsRendererGameObject(component.transform, index.ToString());
                Undo.RegisterCreatedObjectUndo(smr.gameObject, "New Parts Renderer GameObject.");
                componentRenderers.Add(smr);

                // increment renderer sorting order.
                if (index == 0)
                {
                    continue;
                }
                var prev = componentRenderers[index - 1]; if (prev == null)
                {
                    continue;
                }

                var prevMeshRenderer    = prev.GetComponent <MeshRenderer>();
                var currentMeshRenderer = smr.GetComponent <MeshRenderer>();
                if (prevMeshRenderer == null || currentMeshRenderer == null)
                {
                    continue;
                }

                int prevSortingLayer = prevMeshRenderer.sortingLayerID;
                int prevSortingOrder = prevMeshRenderer.sortingOrder;
                currentMeshRenderer.sortingLayerID = prevSortingLayer;
                currentMeshRenderer.sortingOrder   = prevSortingOrder + SkeletonRenderSeparator.DefaultSortingOrderIncrement;
            }
        }
        void OnEnable()
        {
            if (component == null)
            {
                component = target as SkeletonRenderSeparator;
            }

            skeletonRenderer_      = serializedObject.FindProperty("skeletonRenderer");
            copyPropertyBlock_     = serializedObject.FindProperty("copyPropertyBlock");
            copyMeshRendererFlags_ = serializedObject.FindProperty("copyMeshRendererFlags");

            var partsRenderers = component.partsRenderers;

            partsRenderers_            = serializedObject.FindProperty("partsRenderers");
            partsRenderers_.isExpanded = partsRenderersExpanded ||                                                                                      // last state
                                         partsRenderers.Contains(null) ||                                                                               // null items found
                                         partsRenderers.Count < 1 ||                                                                                    // no parts renderers
                                         (skeletonRenderer_.objectReferenceValue != null && SkeletonRendererSeparatorCount + 1 > partsRenderers.Count); // not enough parts renderers
        }