private static Dictionary <string, AnimationClip> loadAnimClips(string name, ref string defaultAnimName) { var path = "Assets/Config/Animation/" + name + ".csv"; var loader = new CSVLoader(); var text = readAllText(path); if (!loader.Load(text)) { EditorUtility.DisplayDialog("错误", "加载动画表失败: " + path, "继续工作"); return(null); } var nameCol = loader.GetColumn("Name"); var fbxCol = loader.GetColumn("FBXPath"); var defaultCol = loader.GetColumn("IsDefault"); Dictionary <string, AnimationClip> clips = new Dictionary <string, AnimationClip>(); Dictionary <string, List <string> > infos = new Dictionary <string, List <string> >(); for (int row = 0; row < loader.RowCount(); row++) { var fbxPath = fbxCol.GetString(row); var aniClipName = nameCol.GetString(row); List <string> subAnimNames = null; if (!infos.TryGetValue(fbxPath, out subAnimNames)) { subAnimNames = new List <string>(); infos.Add(fbxPath, subAnimNames); } if (defaultAnimName == null || defaultCol.GetBoolean(row)) { defaultAnimName = aniClipName; } subAnimNames.Add(aniClipName); } foreach (var p in infos) { var animRootPath = AnimPath + "/" + p.Key; foreach (var pp in p.Value) { var animPath = animRootPath + "/" + pp + ".anim"; var clip = AssetDatabase.LoadAssetAtPath <AnimationClip>(animPath); if (clip == null) { EditorUtility.DisplayDialog("错误", "加载动画切片失败: " + animPath, "继续工作"); return(null); } clips.Add(pp, clip); } } return(clips); }
private static void CreateActorPrefab() { var selected = Selection.activeObject; if (selected == null) { EditorUtility.DisplayDialog("错误", "请选中对应预制件配置表", "继续工作"); return; } var path = AssetDatabase.GetAssetPath(selected); //Assets/Config/Animation/mengjiang.csv if (!path.StartsWith("Assets/Config/Prefab") || !path.EndsWith(".csv")) { EditorUtility.DisplayDialog("错误", "请选中对应预制件配置表", "继续工作"); return; } var loader = new CSVLoader(); var text = readAllText(path); if (!loader.Load(text)) { EditorUtility.DisplayDialog("错误", "加载预制件配置失败: " + path, "继续工作"); return; } var nameCol = loader.GetColumn("Name"); var animCol = loader.GetColumn("Animation"); var matCol = loader.GetColumn("Material"); var meshCol = loader.GetColumn("Mesh"); Dictionary <string, Dictionary <string, AnimationClip> > allClips = new Dictionary <string, Dictionary <string, AnimationClip> >(); Dictionary <string, string> defaultClipNames = new Dictionary <string, string>(); for (int row = 0; row < loader.RowCount(); row++) { string animName = animCol.GetString(row); string defaultName = null; Dictionary <string, AnimationClip> clips = null; if (!allClips.TryGetValue(animName, out clips)) { clips = loadAnimClips(animName, ref defaultName); if (clips != null) { defaultClipNames.Add(animName, defaultName); allClips.Add(animName, clips); } else { EditorUtility.DisplayDialog("错误", "无法加载对应的动画切片: " + animName, "继续工作"); } } else { defaultClipNames.TryGetValue(animName, out defaultName); } _doCreateActorPrefab( nameCol.GetString(row), clips, defaultName, meshCol.GetString(row), matCol.GetString(row) ); } EditorUtility.DisplayDialog("创建主角预制件", "完成", "继续工作"); }
private static void SplitSelectedActorAnim() { var selected = Selection.activeObject; if (selected == null) { EditorUtility.DisplayDialog("错误", "请选中对应动画配置表", "继续工作"); return; } var path = AssetDatabase.GetAssetPath(selected); //Assets/Config/Animation/mengjiang.csv if (!path.StartsWith("Assets/Config/Animation") || !path.EndsWith(".csv")) { EditorUtility.DisplayDialog("错误", "请选中对应动画配置表", "继续工作"); return; } string animationName = Path.GetFileNameWithoutExtension(path); var loader = new CSVLoader(); var text = readAllText(path); if (!loader.Load(text)) { EditorUtility.DisplayDialog("错误", "加载动画表失败: " + path, "继续工作"); } var nameCol = loader.GetColumn("Name"); var fbxCol = loader.GetColumn("FBXPath"); var compCol = loader.GetColumn("Compression"); var defaultCol = loader.GetColumn("IsDefault"); string defaultAnimName = null; List <string> anims = new List <string>(); Dictionary <string, List <AnimSplit> > infos = new Dictionary <string, List <AnimSplit> >(); for (int row = 0; row < loader.RowCount(); row++) { var animInfo = new AnimSplit(); animInfo.Name = nameCol.GetString(row); animInfo.FBXPath = fbxCol.GetString(row); animInfo.Compression = compCol.GetInteger32(row); List <AnimSplit> subAnimInfos = null; if (!infos.TryGetValue(animInfo.FBXPath, out subAnimInfos)) { subAnimInfos = new List <AnimSplit>(); infos.Add(animInfo.FBXPath, subAnimInfos); } if (defaultAnimName == null || defaultCol.GetBoolean(row)) { defaultAnimName = animInfo.Name; } subAnimInfos.Add(animInfo); anims.Add(animInfo.Name); } bool result = true; foreach (var p in infos) { if (!_doSplitSelectedActorAnim(animationName, p.Key, p.Value)) { result = false; } } if (result && defaultAnimName != null) { EditorUtility.DisplayDialog("拆分主角动画", "已完成", "继续工作"); } else { EditorUtility.DisplayDialog("错误", "切分失败", "继续工作"); } return; }