static void ShowSpriteFrame(SpriteFrame frame, Material mat, DragonBoneData.SkinSlotDisplayData displayData, Transform slot, DragonBoneData.SlotData slotData)
        {
            SpriteFrame newFrame = (SpriteFrame)GameObject.Instantiate(frame);

            newFrame.atlasMat = mat;
            newFrame.CreateQuad();
            newFrame.frameName        = displayData.textureName;
            newFrame.name             = displayData.textureName;
            newFrame.pivot            = displayData.pivot;
            newFrame.transform.parent = slot;

            Vector3 localPos = Vector3.zero;

            if (!float.IsNaN(displayData.transform.x))
            {
                localPos.x = displayData.transform.x;
            }
            if (!float.IsNaN(displayData.transform.y))
            {
                localPos.y = displayData.transform.y;
            }
            newFrame.transform.localPosition = localPos;

            Vector3 localSc = Vector3.one;

            if (!float.IsNaN(displayData.transform.scx))
            {
                localSc.x = displayData.transform.scx;
            }
            if (!float.IsNaN(displayData.transform.scy))
            {
                localSc.y = displayData.transform.scy;
            }
            newFrame.transform.localScale = localSc;

            Color c = Color.white;

            if (slotData.color != null)
            {
                c.a            = slotData.color.aM + slotData.color.a0;
                c.r            = slotData.color.rM + slotData.color.r0;
                c.g            = slotData.color.gM + slotData.color.g0;
                c.b            = slotData.color.bM + slotData.color.b0;
                newFrame.color = c;
            }

            if (!float.IsNaN(displayData.transform.rotate))
            {
                newFrame.transform.localRotation = Quaternion.Euler(0, 0, displayData.transform.rotate);
            }
        }
        void UpdatePivot(SpriteFrame sprite, int selectPivot)
        {
            m_pivotIndex = selectPivot;
            sprite.CreateQuad();
            switch (selectPivot)
            {
            case 1:
                sprite.pivot = new Vector2(0.5f, 0.5f);
                break;

            case 2:
                sprite.pivot = new Vector2(0.5f, 1f);
                break;

            case 3:
                sprite.pivot = new Vector2(0f, 1f);
                break;

            case 4:
                sprite.pivot = new Vector2(1f, 1f);
                break;

            case 5:
                sprite.pivot = new Vector2(0f, 0.5f);
                break;

            case 6:
                sprite.pivot = new Vector2(1f, 0.5f);
                break;

            case 7:
                sprite.pivot = new Vector2(0.5f, 0f);
                break;

            case 8:
                sprite.pivot = new Vector2(0f, 0f);
                break;

            case 9:
                sprite.pivot = new Vector2(1f, 0f);
                break;
            }
        }
Beispiel #3
0
        static void ShowSpriteFrame(SpriteFrame frame, Material mat, DragonBoneData.SkinSlotDisplayData displayData, Transform slot, DragonBoneData.SlotData slotData)
        {
            SpriteFrame newFrame = (SpriteFrame)GameObject.Instantiate(frame);

            newFrame.atlasMat = mat;
            newFrame.CreateQuad();
            newFrame.frameName        = displayData.textureName;
            newFrame.name             = displayData.textureName;
            newFrame.pivot            = displayData.pivot;
            newFrame.transform.parent = slot;

            Vector3 localPos = Vector3.zero;

            if (!float.IsNaN(displayData.transform.x))
            {
                localPos.x = displayData.transform.x;
            }
            if (!float.IsNaN(displayData.transform.y))
            {
                localPos.y = displayData.transform.y;
            }
            newFrame.transform.localPosition = localPos;

            Vector3 localSc = Vector3.one;

            if (!float.IsNaN(displayData.transform.scx))
            {
                localSc.x = displayData.transform.scx;
            }
            if (!float.IsNaN(displayData.transform.scy))
            {
                localSc.y = displayData.transform.scy;
            }
            newFrame.transform.localScale = localSc;

            newFrame.color = slot.GetComponent <Slot>().color;

            if (!float.IsNaN(displayData.transform.rotate))
            {
                newFrame.transform.localRotation = Quaternion.Euler(0, 0, displayData.transform.rotate);
            }
        }
Beispiel #4
0
        public static void ShowSkins(ArmatureEditor armatureEditor)
        {
            if (armatureEditor.armatureData.skinDatas != null && armatureEditor.armatureData.skinDatas.Length > 0)
            {
                DragonBoneArmature armature            = armatureEditor.armature.GetComponent <DragonBoneArmature>();
                Dictionary <Texture2D, Material> matKV = new Dictionary <Texture2D, Material>();
                List <Material> mats = new List <Material>();
                //创建贴图集的材质
                Material atlasMat = null;
                if (armatureEditor.altasTexture)
                {
                    Material mat  = null;
                    string   path = AssetDatabase.GetAssetPath(armatureEditor.altasTexture);
                    path = path.Substring(0, path.LastIndexOf('.')) + "_Mat.mat";
                    mat  = AssetDatabase.LoadAssetAtPath <Material>(path);
                    if (!mat)
                    {
                        mat = new Material(Shader.Find("DragonBone/DragonBone Simple"));
                        AssetDatabase.CreateAsset(mat, path);
                    }
                    mat.mainTexture = armatureEditor.altasTexture;
                    matKV[armatureEditor.altasTexture] = mat;
                    atlasMat = mat;
                    mats.Add(mat);
                }

                if (armatureEditor.otherTextures != null && armatureEditor.otherTextures.Length > 0)
                {
                    for (int r = 0; r < armatureEditor.otherTextures.Length; ++r)
                    {
                        ArmatureEditor.Atlas atlas = armatureEditor.otherTextures[r];
                        Material             mat   = null;

                        string path = AssetDatabase.GetAssetPath(atlas.texture);
                        path = path.Substring(0, path.LastIndexOf('.')) + "_Mat.mat";
                        mat  = AssetDatabase.LoadAssetAtPath <Material>(path);
                        if (!mat)
                        {
                            mat = new Material(Shader.Find("DragonBone/DragonBone Simple"));
                            AssetDatabase.CreateAsset(mat, path);
                        }
                        mat.mainTexture      = atlas.texture;
                        matKV[atlas.texture] = mat;
                        mats.Add(mat);
                    }
                }

                //create Frames
                Dictionary <Texture2D, SpriteFrame> frameKV = new Dictionary <Texture2D, SpriteFrame>();
                List <TextureFrame> tfs = new List <TextureFrame>();

                SpriteFrame frame = null;
                if (armatureEditor.altasTextAsset != null)
                {
                    GameObject  go = new GameObject();
                    SpriteFrame sf = go.AddComponent <SpriteFrame>();
                    sf.atlasMat  = atlasMat;
                    sf.atlasText = armatureEditor.altasTextAsset;
                    sf.ParseAtlasText();
                    sf.CreateQuad();
                    frameKV[armatureEditor.altasTexture] = sf;
                    frame = sf;
                    tfs.AddRange(frame.frames);
                }
                if (armatureEditor.otherTextures != null && armatureEditor.otherTextures.Length > 0)
                {
                    for (int r = 0; r < armatureEditor.otherTextures.Length; ++r)
                    {
                        ArmatureEditor.Atlas atlas = armatureEditor.otherTextures[r];
                        GameObject           go    = new GameObject();
                        SpriteFrame          sf    = go.AddComponent <SpriteFrame>();
                        sf.atlasMat  = matKV[atlas.texture];
                        sf.atlasText = atlas.atlasText;
                        sf.ParseAtlasText();
                        sf.CreateQuad();
                        frameKV[atlas.texture] = sf;
                        tfs.AddRange(sf.frames);
                    }
                }

                List <SpriteMetaData> metaDatas = new List <SpriteMetaData>();
                List <SpriteRenderer> sprites   = new List <SpriteRenderer>();

                int meshSpriteCount = 0;
                int len             = armatureEditor.armatureData.skinDatas.Length;
                for (int i = 0; i < len; ++i)
                {
                    DragonBoneData.SkinData skinData = armatureEditor.armatureData.skinDatas[i];
                    for (int j = 0; j < skinData.slots.Length; ++j)
                    {
                        DragonBoneData.SkinSlotData skinSlotData = skinData.slots[j];
                        Transform slot = armatureEditor.slotsKV[skinSlotData.slotName];
                        DragonBoneData.SlotData slotData = armatureEditor.slotsDataKV[skinSlotData.slotName];
                        if (slot && skinSlotData.displays != null && skinSlotData.displays.Length > 0)
                        {
                            for (int k = 0; k < skinSlotData.displays.Length; ++k)
                            {
                                DragonBoneData.SkinSlotDisplayData displayData = skinSlotData.displays[k];
                                if (displayData.type != "image" && displayData.type != "mesh" && displayData.type != "boundingBox")
                                {
                                    continue;
                                }

                                if (displayData.type.Equals("boundingBox"))
                                {
                                    if (displayData.subType == "polygon")
                                    {
                                        ShowCustomCollider(displayData, slot, armatureEditor, slotData);
                                    }
                                    continue;
                                }

                                ArmatureEditor.Atlas atlas = armatureEditor.GetAtlasByTextureName(displayData.texturePath);
                                if (!armatureEditor.isSingleSprite)
                                {
                                    atlasMat = matKV[atlas.texture];
                                    frame    = frameKV[atlas.texture];
                                }

                                if (displayData.type == "image")
                                {
                                    if (armatureEditor.useUnitySprite)
                                    {
                                        if (armatureEditor.isSingleSprite)
                                        {
                                            Sprite sprite     = armatureEditor.spriteKV[displayData.textureName];
                                            string spritePath = AssetDatabase.GetAssetPath(sprite);
                                            if (displayData.pivot.x != 0 || displayData.pivot.y != 0)
                                            {
                                                TextureImporter textureImporter = AssetImporter.GetAtPath(spritePath) as TextureImporter;
                                                textureImporter.textureType         = TextureImporterType.Sprite;
                                                textureImporter.spriteImportMode    = SpriteImportMode.Single;
                                                textureImporter.spritePixelsPerUnit = 100;
                                                textureImporter.spritePivot         = new Vector2((displayData.pivot.x + sprite.rect.width / 2) / sprite.rect.width, (displayData.pivot.y + sprite.rect.height / 2) / sprite.rect.height);
                                                AssetDatabase.ImportAsset(spritePath, ImportAssetOptions.ForceUpdate);
                                            }
                                            sprites.Add(ShowUnitySpriteSingle(sprite, displayData, slot, slotData));
                                        }
                                        else
                                        {
                                            SpriteMetaData metaData = new SpriteMetaData();
                                            metaData.name   = displayData.textureName;
                                            metaData.rect   = frame.GetFrameByName(displayData.texturePath).rect;
                                            metaData.rect.y = armatureEditor.altasTexture.height - metaData.rect.y - metaData.rect.height;
                                            if (displayData.pivot.x != 0 || displayData.pivot.y != 0)
                                            {
                                                metaData.alignment = (int)SpriteAlignment.Custom;
                                                metaData.pivot     = new Vector2((displayData.pivot.x + metaData.rect.width / 2) / metaData.rect.width, (displayData.pivot.y + metaData.rect.height / 2) / metaData.rect.height);
                                            }
                                            metaDatas.Add(metaData);
                                            sprites.Add(ShowUnitySprite(atlasMat, displayData, slot, metaData, slotData));
                                        }
                                    }
                                    else
                                    {
                                        ShowSpriteFrame(frame, atlasMat, displayData, slot, slotData);
                                    }
                                }
                                else if (displayData.type == "mesh")
                                {
                                    TextureFrame textureFrame = new TextureFrame();
                                    if (armatureEditor.isSingleSprite)
                                    {
                                        Sprite sprite = armatureEditor.spriteKV[displayData.textureName];
                                        textureFrame.name             = displayData.textureName;
                                        textureFrame.frameSize        = sprite.rect;
                                        textureFrame.rect             = sprite.rect;
                                        textureFrame.atlasTextureSize = new Vector2(sprite.rect.width, sprite.rect.height);

                                        string path           = AssetDatabase.GetAssetPath(sprite);
                                        string materialFolder = path.Substring(0, path.LastIndexOf("/"));
                                        materialFolder = materialFolder.Substring(0, materialFolder.LastIndexOf("/")) + "/Materials/";
                                        if (!Directory.Exists(materialFolder))
                                        {
                                            Directory.CreateDirectory(materialFolder);
                                        }
                                        string matPath = materialFolder + sprite.name + "_Mat.mat";
                                        atlasMat = AssetDatabase.LoadAssetAtPath <Material>(matPath);
                                        if (!atlasMat)
                                        {
                                            atlasMat = new Material(Shader.Find("DragonBone/DragonBone Simple"));
                                            AssetDatabase.CreateAsset(atlasMat, matPath);
                                        }
                                        atlasMat.mainTexture = AssetDatabase.LoadAssetAtPath <Texture>(path);

                                        mats.Add(atlasMat);
                                        textureFrame.material = atlasMat;
                                        textureFrame.texture  = atlasMat.mainTexture;
                                        tfs.Add(textureFrame);
                                    }
                                    else
                                    {
                                        foreach (TextureFrame st in frame.frames)
                                        {
                                            if (st.name.Equals(displayData.textureName))
                                            {
                                                textureFrame = st;
                                                break;
                                            }
                                        }
                                    }
                                    if (textureFrame.rect.width > 0 && textureFrame.rect.height > 0 && atlasMat && atlasMat.mainTexture)
                                    {
                                        ShowSpriteMesh(textureFrame, atlasMat, displayData, slot, armatureEditor, slotData);
                                        ++meshSpriteCount;
                                    }
                                }
                            }
                            slot.GetComponent <Slot>().displayIndex = slotData.displayIndex;
                        }
                    }
                }
                armature.materials     = mats.ToArray();
                armature.textureFrames = tfs.ToArray();

                foreach (SpriteFrame sf in frameKV.Values)
                {
                    GameObject.DestroyImmediate(sf.gameObject);
                }

                if (armatureEditor.useUnitySprite)
                {
                    if (!armatureEditor.isSingleSprite)
                    {
                        if (metaDatas.Count > 0)
                        {
                            string          textureAtlasPath = AssetDatabase.GetAssetPath(armatureEditor.altasTexture);
                            TextureImporter textureImporter  = AssetImporter.GetAtPath(textureAtlasPath) as TextureImporter;
                            textureImporter.maxTextureSize      = 2048;
                            textureImporter.spritesheet         = metaDatas.ToArray();
                            textureImporter.textureType         = TextureImporterType.Sprite;
                            textureImporter.spriteImportMode    = SpriteImportMode.Multiple;
                            textureImporter.spritePixelsPerUnit = 100;
                            AssetDatabase.ImportAsset(textureAtlasPath, ImportAssetOptions.ForceUpdate);
                            Object[] savedSprites = AssetDatabase.LoadAllAssetsAtPath(textureAtlasPath);
                            foreach (Object obj in savedSprites)
                            {
                                Sprite objSprite = obj as Sprite;
                                if (objSprite)
                                {
                                    len = sprites.Count;
                                    for (int i = 0; i < len; ++i)
                                    {
                                        if (sprites[i].name.Equals(objSprite.name))
                                        {
                                            sprites[i].sprite = objSprite;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (atlasMat != null)
                    {
                        if (meshSpriteCount == 0)
                        {
                            //can delete safely
                            foreach (Material mat in matKV.Values)
                            {
                                if (!armatureEditor.spriteMeshUsedMatKV.ContainsKey(mat))
                                {
                                    AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(mat));
                                }
                            }
                        }
                        else
                        {
                            foreach (SpriteRenderer sprite in sprites)
                            {
                                sprite.material = atlasMat;
                            }
                        }
                    }
                }
            }
        }
        public override void OnInspectorGUI()
        {
            SpriteFrame sprite = target as SpriteFrame;

            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("atlasText"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("atlasMat"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("textureScale"), true);
            EditorGUILayout.BeginVertical();

            if (sprite.frames != null && sprite.frames.Length > 0)
            {
                //显示frameName列表
                string[] list = new string[sprite.frames.Length];
                for (int i = 0; i < sprite.frames.Length; ++i)
                {
                    list[i] = sprite.frames[i].name;
                }
                int selectIndex = EditorGUILayout.Popup("Frame", m_frameIndex, list);
                if (selectIndex != m_frameIndex)
                {
                    m_frameIndex = selectIndex;
                    sprite.CreateQuad();
                    sprite.frameName = sprite.frames[m_frameIndex].name;
                    UpdatePivot(sprite, m_pivotIndex);
                }
            }
            bool   create    = (sprite.frames == null || sprite.frames.Length == 0);
            string btnString = create?"Create SpriteFrame" : "Update SpriteFrame";

            if (GUILayout.Button(btnString))
            {
                sprite.ParseAtlasText();
                if (sprite.atlasText != null && sprite.atlasMat != null && sprite.atlasMat.mainTexture != null)
                {
                    sprite.ParseAtlasText();
                    if (sprite.frames.Length > 0)
                    {
                        sprite.CreateQuad();
                        if (create)
                        {
                            sprite.frameName = sprite.frames[0].name;
                            sprite.pivot     = new Vector2(0.5f, 0.5f);
                        }
                        else
                        {
                            sprite.frameName = sprite.frameName;
                        }
                    }
                }
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.Space();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_textureSize"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_uvOffset"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_pivot"), true);
            if (sprite.frames != null && !string.IsNullOrEmpty(sprite.frameName))
            {
                //			"None","CENTER","TOP","TOP_LEFT","TOP_RIGHT",
                //			"LEFT","RIGHT","BOTTOM","BOTTOM_LEFT","BOTTOM_RIGHT"
                int selectPivot = EditorGUILayout.Popup("Auto Pivot", m_pivotIndex, posList);
                if (selectPivot != m_pivotIndex)
                {
                    UpdatePivot(sprite, selectPivot);
                    sprite.frameName = sprite.frameName;
                }
            }
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_color"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_brightness"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_sortingLayerName"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("m_soringOrder"), true);
            serializedObject.ApplyModifiedProperties();
        }