예제 #1
0
        /// <summary>
        /// Resets the slot Z order to pose order.
        /// </summary>
        public void ResetSlotZOrder()
        {
            if (slots == null || slots.Length == 0)
            {
                return;
            }

            if (isUGUI)
            {
                int count = slots.Length;
                for (int i = 0; i < count; ++i)
                {
                    Slot slot = slots[i];
                    if (slot)
                    {
                        slot.transform.SetSiblingIndex(slot.zOrder);
                                                #if UNITY_EDITOR
                        if (!Application.isPlaying)
                        {
                            UnityEditor.EditorUtility.SetDirty(slot.transform);
                        }
                                                #endif
                    }
                }
            }
            else
            {
                float tempZ = m_FlipX || m_FlipY ? 1f : -1f;
                if (m_FlipX && m_FlipY)
                {
                    tempZ = -1f;
                }

                tempZ *= zSpace;
                int len = slots.Length;
                for (int i = 0; i < len; ++i)
                {
                    Slot slot = slots[i];
                    if (slot && !slot.manualZ)
                    {
                        Vector3 v = slot.transform.localPosition;
                        v.z = tempZ * slot.zOrder + tempZ;
                        slot.transform.localPosition = v;
                        slot.z = 0;
                        if (sortType == SortType.ZOrder)
                        {
                            slot.UpdateZOrder(slot.zOrder);
                        }
                                                #if UNITY_EDITOR
                        if (!Application.isPlaying)
                        {
                            UnityEditor.EditorUtility.SetDirty(slot.transform);
                        }
                                                #endif
                    }
                }
                m_SortedSlots = null;
            }

            m_OrderSlots.Clear();
            m_CanSortAllSlot = false;
        }
예제 #2
0
        void CalculatZOrder()
        {
            int orderCount = m_OrderSlots.Count;
            int slotCount  = slots.Length;

            int[] unchanged = new int[slotCount - orderCount];

            if (m_NewSlotOrders == null)
            {
                m_NewSlotOrders = new int[slotCount];
            }
            for (int i = 0; i < slotCount; ++i)
            {
                m_NewSlotOrders[i] = -1;
            }

            int originalIndex  = 0;
            int unchangedIndex = 0;

            for (int i = 0; i < orderCount; ++i)
            {
                Slot slot      = m_OrderSlots[i];
                int  slotIndex = slot.zOrder;
                int  offset    = slot.z;
                while (originalIndex != slotIndex)
                {
                    unchanged[unchangedIndex++] = originalIndex++;
                }
                m_NewSlotOrders[originalIndex + offset] = originalIndex++;
            }

            while (originalIndex < slotCount)
            {
                unchanged[unchangedIndex++] = originalIndex++;
            }

            int iC = slotCount;

            while (iC-- != 0)
            {
                if (m_NewSlotOrders[iC] == -1 && unchangedIndex > 0)
                {
                    m_NewSlotOrders[iC] = unchanged[--unchangedIndex];
                }
            }

            if (isUGUI)
            {
                for (int i = 0; i < slotCount; ++i)
                {
                    Slot slot = slots[m_NewSlotOrders[i]];
                    if (slot)
                    {
                        slot.transform.SetSiblingIndex(i);
                    }
                }
            }
            else
            {
                //set order
                float zoff = m_FlipX || m_FlipY ? 1f : -1f;
                if (m_FlipX && m_FlipY)
                {
                    zoff = -1f;
                }
                zoff *= zSpace;
                for (int i = 0; i < slotCount; ++i)
                {
                    if (m_NewSlotOrders[i] < 0)
                    {
                        continue;
                    }
                    Slot slot = slots[m_NewSlotOrders[i]];
                    if (slot && !slot.manualZ)
                    {
                        Vector3 v = slot.transform.localPosition;
                        v.z = zoff * i;
                        slot.transform.localPosition = v;
                    }
                }
                m_SortedSlots = new List <Slot>(slots);
                m_SortedSlots.Sort(delegate(Slot x, Slot y) {
                    if (x.transform.localPosition.z < y.transform.localPosition.z)
                    {
                        return(1);
                    }
                    else if (x.transform.localPosition.z > y.transform.localPosition.z)
                    {
                        return(-1);
                    }
                    return(0);
                });
                if (sortType == SortType.ZOrder)
                {
                    sortingOrder = sortingOrder;
                }
            }
            m_OrderSlots.Clear();
        }
예제 #3
0
        /// <summary>
        /// Sets to pose.
        /// </summary>
        public void SetToPose()
        {
            if (poseData)
            {
                for (int i = 0; i < poseData.boneDatas.Length && i < bones.Length; ++i)
                {
                    Transform bone = bones[i];
                    if (bone)
                    {
                        PoseData.TransformData transData = poseData.boneDatas[i];
                        bone.localPosition    = new Vector3(transData.x, transData.y, bone.localPosition.z);
                        bone.localScale       = new Vector3(transData.sx, transData.sy, bone.localScale.z);
                        bone.localEulerAngles = new Vector3(bone.localEulerAngles.x, bone.localEulerAngles.y, transData.rotation);
                    }
                }
                for (int i = 0; i < poseData.slotDatas.Length && i < slots.Length; ++i)
                {
                    Slot slot = slots[i];
                    if (slot)
                    {
                        slot.color        = poseData.slotDatas[i].color;
                        slot.displayIndex = poseData.slotDatas[i].displayIndex;
                        slot.z            = poseData.slotDatas[i].zorder;
                    }
                    m_SortedSlots = null;
                }
                if (isUGUI)
                {
                    for (int i = 0; i < poseData.displayDatas.Length && i < uiAttachments.Length; ++i)
                    {
                        MaskableGraphic mg = uiAttachments[i];
                        if (mg)
                        {
                            PoseData.DisplayData displayData = poseData.displayDatas[i];
                            switch (displayData.type)
                            {
                            case PoseData.AttachmentType.IMG:
                                UIFrame uf = mg.GetComponent <UIFrame>();
                                if (uf)
                                {
                                    uf.color = displayData.color;
                                }
                                else
                                {
                                    Image img = mg.GetComponent <Image>();
                                    if (img)
                                    {
                                        img.color = displayData.color;
                                    }
                                }
                                break;

                            case PoseData.AttachmentType.MESH:
                                UIMesh um = mg.GetComponent <UIMesh> ();
                                um.vertices = (Vector3[])displayData.vertex.Clone();
                                if (um.vertControlTrans != null && um.vertControlTrans.Length > 0)
                                {
                                    for (int j = 0; j < um.vertControlTrans.Length && j < um.vertices.Length; ++j)
                                    {
                                        Transform vctr = um.vertControlTrans [j];
                                        if (vctr)
                                        {
                                            vctr.localPosition = um.vertices [j];
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < poseData.displayDatas.Length && i < attachments.Length; ++i)
                    {
                        Renderer r = attachments[i];
                        if (r)
                        {
                            PoseData.DisplayData displayData = poseData.displayDatas[i];
                            switch (displayData.type)
                            {
                            case PoseData.AttachmentType.IMG:
                                SpriteFrame sf = r.GetComponent <SpriteFrame>();
                                if (sf)
                                {
                                    sf.color = displayData.color;
                                }
                                else
                                {
                                    SpriteRenderer sr = r.GetComponent <SpriteRenderer>();
                                    if (sr)
                                    {
                                        sr.color = displayData.color;
                                    }
                                }
                                break;

                            case PoseData.AttachmentType.MESH:
                                SpriteMesh sm = r.GetComponent <SpriteMesh>();
                                sm.vertices = (Vector3[])displayData.vertex.Clone();
                                if (sm.vertControlTrans != null)
                                {
                                    for (int j = 0; j < sm.vertControlTrans.Length && j < sm.vertices.Length; ++j)
                                    {
                                        Transform vctr = sm.vertControlTrans[j];
                                        if (vctr)
                                        {
                                            vctr.localPosition = sm.vertices[j];
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
            ResetSlotZOrder();
        }
예제 #4
0
        /// <summary>
        /// Lates the update. Sort slot
        /// </summary>
        void LateUpdate()
        {
                        #if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                if (animator != null)
                {
                    UpdateArmature();
                }

                if (parentArmature)
                {
                    sortType = parentArmature.sortType;
                }
                        #if UNITY_5_6_OR_NEWER
                if (!isUGUI)
                {
                    _sortingGroup = gameObject.GetComponent <UnityEngine.Rendering.SortingGroup>();
                    if (parentArmature)
                    {
                        if (parentArmature.sortingGroup != null)
                        {
                            if (_sortingGroup == null)
                            {
                                _sortingGroup = gameObject.AddComponent <UnityEngine.Rendering.SortingGroup>();
                                _sortingGroup.sortingLayerName = sortingLayerName;
                                _sortingGroup.sortingOrder     = sortingOrder;
                            }
                        }
                        else if (_sortingGroup)
                        {
                            DestroyImmediate(_sortingGroup);
                        }
                    }
                }
                        #endif
            }

            SetAlphaTex();
                        #endif

            //caculate sort
            if (slots != null)
            {
                int len = slots.Length;
                for (int i = 0; i < len; ++i)
                {
                    Slot slot = slots[i];
                    if (slot && slot.isActiveAndEnabled)
                    {
                        slot.CheckZorderChange();
                    }
                }
            }

            if (m_CanSortAllSlot)
            {
                ForceSortAll();
                m_CanSortAllSlot = false;
                int temp = (int)m_ZOrderValid;
                if (Mathf.Abs(m_ZOrderValid - temp) > 0.0001f)
                {
                    return;
                }
                if (temp != __ZOrderValid)
                {
                    __ZOrderValid = temp;
                }
            }
            else
            {
                int temp = (int)m_ZOrderValid;
                if (Mathf.Abs(m_ZOrderValid - temp) > 0.0001f)
                {
                    return;
                }
                if (temp != __ZOrderValid)
                {
                    __ZOrderValid = temp;
                    ResetSlotZOrder();
                }
            }
        }