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); }
/// <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); }