示例#1
0
 public static SpriteSheetFrameData TryCreate(Sprite sprite)
 {
     if (sprite)
     {
         string sheetName  = sprite.name;
         string groupName  = "";
         string actionName = "";
         string idName     = "";
         bool   ret        = GetSheetNameInfo(sheetName, ref groupName, ref actionName, ref idName);
         if (ret)
         {
             SpriteSheetFrameData metadata = new SpriteSheetFrameData();
             metadata.groupName  = groupName;
             metadata.actionName = actionName;
             metadata.idName     = idName;
             metadata.sprite     = sprite;
             return(metadata);
         }
     }
     return(null);
 }
示例#2
0
        /// <summary>
        /// 生成动画及控制器
        /// sprite子项命名规则:组_动作名_编号,没有编号的一律不生成Anima
        /// </summary>
        /// <param name="assetPath"></param>
        public static Dictionary <string, Dictionary <string, AnimationClip> > GenerateAnimationClipFromTextureFile(string assetPath, string saveRootPath = "", System.Action <AnimationClip> callback = null)
        {
            string          assetFileNonExtName = Path.GetFileNameWithoutExtension(assetPath);
            string          assetRootPath       = Path.GetDirectoryName(assetPath);
            TextureImporter importer            = LoadImporterFromTextureFile(assetPath);

            if (importer)
            {
                //判断是否是精灵图集
                if (!(importer.textureType == TextureImporterType.Sprite && importer.spriteImportMode == SpriteImportMode.Multiple))
                {
                    return(null);
                }

                //获取所有精灵帧
                Object[] sheetObjs = AssetDatabase.LoadAllAssetsAtPath(assetPath);
                var      sheetDict = new Dictionary <string, Dictionary <string, SortedList <string, SpriteSheetFrameData> > >();
                foreach (var obj in sheetObjs)
                {
                    SpriteSheetFrameData metadata = SpriteSheetFrameData.TryCreate(obj as Sprite);
                    if (metadata != null)
                    {
                        string groupName = metadata.groupName;
                        Dictionary <string, SortedList <string, SpriteSheetFrameData> > actionMaps;
                        if (sheetDict.ContainsKey(groupName))
                        {
                            actionMaps = sheetDict[groupName];
                        }
                        else
                        {
                            actionMaps = new Dictionary <string, SortedList <string, SpriteSheetFrameData> >();
                            sheetDict.Add(groupName, actionMaps);
                        }
                        //
                        string actionName = metadata.actionName;
                        SortedList <string, SpriteSheetFrameData> frameList;
                        if (actionMaps.ContainsKey(actionName))
                        {
                            frameList = actionMaps[actionName];
                        }
                        else
                        {
                            frameList = new SortedList <string, SpriteSheetFrameData>();
                            actionMaps.Add(actionName, frameList);
                        }

                        string idName = metadata.idName;
                        if (frameList.ContainsKey(idName))
                        {
                            Debug.LogWarning(string.Format("{0}_{1}重复ID:{2}", groupName, actionName, idName));

                            metadata.idName = string.Format("{0}_{1}", metadata.idName, frameList.Count);
                            idName          = metadata.idName;
                        }
                        frameList.Add(idName, metadata);
                    }
                }

                if (saveRootPath == "")
                {
                    saveRootPath = assetRootPath;
                }
                Dictionary <string, Dictionary <string, AnimationClip> > outMap = new Dictionary <string, Dictionary <string, AnimationClip> >();
                foreach (var groupPair in sheetDict)
                {
                    //保存资源
                    string   groupName       = groupPair.Key;
                    string[] subFolders      = groupName.Split(new char[] { '@' });
                    string   saveOutRootPath = saveRootPath;
                    for (int i = 0; i < subFolders.Length; i++)
                    {
                        saveOutRootPath = XPathTools.Combine(saveOutRootPath, subFolders[i]);
                        if (!XFolderTools.Exists(saveOutRootPath))
                        {
                            XFolderTools.CreateDirectory(saveOutRootPath);
                        }
                    }

                    Dictionary <string, AnimationClip> outActionMap;
                    if (outMap.ContainsKey(groupName))
                    {
                        outActionMap = outMap[groupName];
                    }
                    else
                    {
                        outActionMap = new Dictionary <string, AnimationClip>();
                        outMap.Add(groupName, outActionMap);
                    }

                    foreach (var actionPair in groupPair.Value)
                    {
                        //保存动画Clip
                        string outName  = actionPair.Key;
                        string saveName = string.Format("{0}.anim", outName);
                        string savePath = Path.Combine(saveOutRootPath, saveName);

                        List <Sprite> spriteList = new List <Sprite>();
                        foreach (var listPair in actionPair.Value)
                        {
                            spriteList.Add(listPair.Value.sprite);
                        }
                        AnimationClip clip = MakeAnimationClip(spriteList.ToArray(), SpriteToolsConfig.GetInstance().defaultFrameRate, savePath);

                        outActionMap.Add(actionPair.Key, clip);
                        if (callback != null)
                        {
                            callback(clip);
                        }
                    }
                }
                return(outMap);
            }
            return(null);
        }