// *********************************************************************** // Assembly : Unity // Author : Administrator // Created : 2019-07-24 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; using System.IO; public class AnimatiorCreate : Editor { private const string MODEL_ANIMATION_PATH1 = "Assets/Ryff/Arts/Animations"; private const string MODEL_ANIMATION_PATH2 = "Assets/Ryff/Arts/Models"; private const string CONTROLLER_PATH = "Assets/Ryff/Resources/Animators"; //三个Bsae路径 private const string CONTROLLER_BASE_PLAYER_ANIMATOR_PATH = "Assets/Ryff/Resources/Animators/basePlayerAnimator.controller"; private const string CONTROLLER_BASE_MONSTER_ANIMATOR_PATH = "Assets/Ryff/Resources/Animators/baseMonsterAnimator.controller"; private const string CONTROLLER_BASE_RIDE_ANIMATOR_PATH = "Assets/Ryff/Resources/Animators/baseRideAnimator.controller"; private static string[] loopCilpName = new string[] { "idle", "run", "dead", "stand", "stun", "standfight", "runfight", "zhanshi-stand", "x_zhanshi_stand" }; [MenuItem("Assets/Create Animatior %e")] public static void CreateAnimatior() { var strs = Selection.assetGUIDs; for (int i = 0; i < strs.Length; i++) { var path = AssetDatabase.GUIDToAssetPath(strs[i]); if (!path.EndsWith(".fbx", System.StringComparison.CurrentCultureIgnoreCase) || (!path.Contains(MODEL_ANIMATION_PATH1) && !path.Contains(MODEL_ANIMATION_PATH2))) { Debug.LogWarning("请选择动画的FBX文件"); return; } var objs = Selection.gameObjects; var name = objs[0].name; if (name.Contains("@")) { name = name.Split('@')[0]; } //获取动画Clip var animClipDics = new Dictionary(); Object[] assetObjs = AssetDatabase.LoadAllAssetsAtPath(path); var assetImporter = AssetImporter.GetAtPath(path); if (assetImporter is ModelImporter) { var isChange = false; var modelImporter = assetImporter as ModelImporter; modelImporter.clipAnimations = modelImporter.defaultClipAnimations; var clips = modelImporter.clipAnimations; foreach (var clip in clips) { if (IsSetLoop(clip.name) && !clip.loopTime) { clip.loopTime = true; isChange = true; } } if (isChange) { modelImporter.clipAnimations = clips; AssetDatabase.ImportAsset(path); } } animClipDics.Clear(); foreach (var item in assetObjs) { if (item as AnimationClip) { var clip = item as AnimationClip; animClipDics.Add(clip.name, clip); } } AnimatorOverrideController aoc = null; var selectFbxControllerPath = string.Format("{0}/animator_{1}.overrideController", CONTROLLER_PATH, name); if (!File.Exists(selectFbxControllerPath)) { string basepath = string.Empty; if (name.IndexOf("mount") != -1) { basepath = CONTROLLER_BASE_RIDE_ANIMATOR_PATH; } else if (name.IndexOf("monster") != -1 || name.IndexOf("npc") != -1 || name.IndexOf("pet") != -1 || name.IndexOf("boss") != -1) { basepath = CONTROLLER_BASE_MONSTER_ANIMATOR_PATH; } else { basepath = CONTROLLER_BASE_PLAYER_ANIMATOR_PATH; } var baseController = AssetDatabase.LoadAssetAtPath(basepath); aoc = new AnimatorOverrideController(baseController); AssetDatabase.CreateAsset(aoc, selectFbxControllerPath); AssetDatabase.SaveAssets(); Debug.Log("Creat AnimatorOverrideController"); } aoc = AssetDatabase.LoadAssetAtPath(selectFbxControllerPath); if (!aoc) { Debug.LogError("没有找到动画控制器"); return; } var overrides = new List>(); aoc.GetOverrides(overrides); for (int j = 0; j < overrides.Count; j++) { var current = overrides[j]; if (animClipDics.ContainsKey(current.Key.name)) { overrides[j] = new KeyValuePair(current.Key, animClipDics[current.Key.name]); } else { Debug.LogWarning(string.Format("{0} 控制器中的 {1} 无对应Action", name, current.Key.name)); } } aoc.ApplyOverrides(overrides); AssetDatabase.SaveAssets(); Debug.Log("设置成功"); } } private static bool IsSetLoop(string name) { for (int i = 0; i < loopCilpName.Length; i++) { if (name.StartsWith(loopCilpName[i])) return true; } return false; } }