public AnimatorControllerConfig LoadAnimatorConfigJson(string json) { AnimatorControllerConfig animatorControllerConfig = null; Dictionary <string, AnimatorControllerConfig> animatorControllerConfigDic = null; try { animatorControllerConfigDic = Tools.Json2Obj <Dictionary <string, AnimatorControllerConfig> >(json); } catch (Exception e) { Debug.Log("animatorControllerConfig 类型不为字典类型:" + e); } if (animatorControllerConfigDic != null) { animatorControllerConfig = new AnimatorControllerConfig(); animatorControllerConfig.parameters = new List <AnimatorParameter>(); animatorControllerConfig.states = new List <AnimatorState>(); animatorControllerConfig.transitions = new List <AnimatorTransition>(); foreach (var pair in animatorControllerConfigDic) { if (pair.Value.parameters != null) { foreach (var parameter in pair.Value.parameters) { animatorControllerConfig.parameters.Add(parameter); } } if (pair.Value.states != null) { foreach (var state in pair.Value.states) { animatorControllerConfig.states.Add(state); } } if (pair.Value.transitions != null) { foreach (var transition in pair.Value.transitions) { animatorControllerConfig.transitions.Add(transition); } } } } else { animatorControllerConfig = Tools.Json2Obj <AnimatorControllerConfig>(json); } Debug.Assert(animatorControllerConfig != null, "animatorControllerConfig 不能为空"); return(animatorControllerConfig); }
void CreateAnimatorByJsonText(string text) { if (string.IsNullOrEmpty(text) == false) { string animatorControllerConfigJsonString = text; AnimatorControllerConfig animatorControllerConfig = LoadAnimatorConfigJson(animatorControllerConfigJsonString); Debug.Log("animatorControllerConfigJsonString = " + animatorControllerConfigJsonString); CreateAnimatorByConfig(animatorControllerConfig); } }
void CreateAnimatorByConfig(AnimatorControllerConfig animatorControllerConfig) { if (animatorControllerConfig != null) { Debug.Log("target = " + target); Undo.RecordObject(target, "animatorController"); // 支持撤销 add by TangJian 2018/04/16 15:41:34 AnimatorController animatorController = target as AnimatorController; AnimationClip[] animationClips = animatorController.animationClips; AnimatorControllerLayer[] animatorControllerLayers = animatorController.layers; AnimatorStateMachine animatorStateMachine = animatorControllerLayers[0].stateMachine; string animatorControllerPath = AssetDatabase.GetAssetPath(animatorController); Object[] clips = AssetDatabase.LoadAllAssetRepresentationsAtPath(animatorControllerPath); animatorController.parameters = null; foreach (var parameterConfig in animatorControllerConfig.parameters) { animatorController.AddParameter(parameterConfig.name, parameterConfig.type); } // 添加所有状态 add by TangJian 2018/04/17 20:08:41 foreach (var stateConfig in animatorControllerConfig.states) { var state = animatorStateMachine.AddStateEx(stateConfig.name); state.behaviours = null; state.transitions = null; // 清空所有状态 add by TangJian 2018/04/17 20:45:08 state.tag = stateConfig.tag; state.speed = stateConfig.Speed; CountsThrow(clips, stateConfig.animName); state.motion = clips.First(o => o.name == stateConfig.animName) as Motion; if (state.motion is AnimationClip animationClip) { AnimationClipSettings animationClipSettings = AnimationUtility.GetAnimationClipSettings(animationClip); animationClipSettings.loopTime = stateConfig.loop; AnimationUtility.SetAnimationClipSettings(animationClip, animationClipSettings); } // 添加BlendTree if (stateConfig.blendTree != null) { if (state.motion is UnityEditor.Animations.BlendTree) { UnityEditor.Animations.BlendTree blendTree = state.motion as UnityEditor.Animations.BlendTree; // BlendTree属性设置 add by TangJian 2018/9/18 18:06 blendTree.name = "blendTree_" + state.name; blendTree.blendParameter = stateConfig.blendTree.blendParameter; blendTree.useAutomaticThresholds = stateConfig.blendTree.useAutomaticThresholds; List <UnityEditor.Animations.ChildMotion> addChildMotionList = new List <UnityEditor.Animations.ChildMotion>(); foreach (var childMotionConfig in stateConfig.blendTree.childMotions) { UnityEditor.Animations.ChildMotion childMotion = new UnityEditor.Animations.ChildMotion(); childMotion.threshold = childMotionConfig.threshold; childMotion.timeScale = childMotionConfig.timeScale; addChildMotionList.Add(childMotion); } var oldBlendTree = state.motion as UnityEditor.Animations.BlendTree; var oldChildren = oldBlendTree.children; var newChildren = new List <UnityEditor.Animations.ChildMotion>(); // 更新oldChildren add by TangJian 2018/9/18 18:07 for (int i = 0; i < oldChildren.Length; i++) { if (i < addChildMotionList.Count) { oldChildren[i].threshold = addChildMotionList[i].threshold; oldChildren[i].timeScale = addChildMotionList[i].timeScale; } } // 添加oldChildren中的motion到newChildren add by TangJian 2018/9/18 18:08 foreach (var item in oldChildren) { newChildren.Add(item); } // 添加剩余addChildMotionList中的motion到newChildren add by TangJian 2018/9/18 18:08 if (blendTree.children.Length > oldChildren.Length) { for (int i = oldChildren.Length; i < blendTree.children.Length; i++) { newChildren.Add(blendTree.children[i]); } } blendTree.children = newChildren.ToArray(); if (stateConfig.blendTree.useAutomaticThresholds) { if (stateConfig.blendTree.minThreshold > int.MinValue && stateConfig.blendTree.maxThreshold > int.MinValue) { blendTree.minThreshold = stateConfig.blendTree.minThreshold; blendTree.maxThreshold = stateConfig.blendTree.maxThreshold; } else { blendTree.minThreshold = 0; blendTree.maxThreshold = blendTree.children.Length - 1; } } state.motion = blendTree; } else { state.motion = GetBlendTreeToMotion(animatorController, "blendTree_" + state.name, stateConfig.blendTree); } } if (stateConfig.script != null) { if (stateConfig.script == "RoleHide") { state.AddStateMachineBehaviour <RoleHideStateMachineBehaviour>(); } } } // 添加额外的跳转 add by TangJian 2018/04/17 20:20:52 foreach (var transitionConfig in animatorControllerConfig.transitions) { if (transitionConfig.sourceAnimName == "Any") { foreach (var stateConfig in animatorControllerConfig.states) { var fromState = animatorStateMachine.GetState(stateConfig.name); var toState = animatorStateMachine.GetState(transitionConfig.destinationAnimName); if (fromState != null && toState != null) { fromState.AddTransitionEx(toState, transitionConfig); } } } else { var fromState = animatorStateMachine.GetState(transitionConfig.sourceAnimName); var toState = animatorStateMachine.GetState(transitionConfig.destinationAnimName); if (fromState != null && toState != null) { fromState.AddTransitionEx(toState, transitionConfig); } } } // 添加状态的跳转 add by TangJian 2018/04/17 20:11:08 foreach (var stateConfig in animatorControllerConfig.states) { // 添加状态的跳转 add by TangJian 2018/04/17 20:11:39 foreach (var transitionConfig in stateConfig.transitions) { var fromState = animatorStateMachine.GetState(stateConfig.name); var toState = animatorStateMachine.GetState(transitionConfig.destinationAnimName); if (fromState != null && toState != null) { fromState.AddTransitionEx(toState, transitionConfig); } } } // 添加脚本 add by TangJian 2018/04/17 21:16:02 foreach (var stateConfig in animatorControllerConfig.states) { var state = animatorStateMachine.GetState(stateConfig.name); RoleBehaviour roleBehaviour = state.AddStateMachineBehaviour <RoleBehaviour>(); // 限制状态可以执行到的时间 add by TangJian 2019/5/14 10:35 roleBehaviour.StateDuration = stateConfig.duration; if (state.motion != null) { if (state.motion is UnityEditor.Animations.BlendTree) { var blendTree = state.motion as UnityEditor.Animations.BlendTree; if (blendTree.children.Length != 0) { FrameEventBehaviour frameEventBehaviour = state.AddStateMachineBehaviour <FrameEventBehaviour>(); Motion motion = blendTree.children[0].motion; if (motion != null) { frameEventBehaviour.animName = motion.name; frameEventBehaviour.Parameter = blendTree.blendParameter; frameEventBehaviour.namelist.Clear(); frameEventBehaviour.beginTime = stateConfig.beginTime; frameEventBehaviour.endTime = stateConfig.endTime; for (int i = 0; i < blendTree.children.Length; i++) { UnityEditor.Animations.ChildMotion child = blendTree.children[i]; Motion childmotion = blendTree.children[i].motion; if (childmotion != null && string.IsNullOrWhiteSpace(childmotion.name) == false) { // frameEventBehaviour.namelist.Insert(i, childmotion.name); frameEventBehaviour.floatList.Insert(i, child.threshold); } } } } } else { FrameEventBehaviour frameEventBehaviour = state.AddStateMachineBehaviour <FrameEventBehaviour>(); Motion motion = state.motion; frameEventBehaviour.animName = motion.name; if (motion is AnimationClip animationClip) { frameEventBehaviour.beginTime = stateConfig.beginTime / animationClip.length; frameEventBehaviour.endTime = stateConfig.endTime / animationClip.length; } } } state.AddStateMachineBehaviour <HumanMoveXYByAnimBehaviour>(); if (state.tag == "attack") { state.AddStateMachineBehaviour <HumanMainHandAttackBehaviour>(); } if (state.name == "jump_1") { state.AddStateMachineBehaviour <RolePreJumpBehaviour>(); } if (state.name == "JumpPre") { state.AddStateMachineBehaviour <RolePreJumpBehaviour>(); } if (state.tag == "hurtHold") { state.AddStateMachineBehaviour <RoleHurtHoldStateMachineBehaviour>(); } if (stateConfig.behaviours != null) { foreach (var item in stateConfig.behaviours) { MethodDelegate <bool> func = CSScript.CreateFunc <bool>( @" using Tang; bool Sum(UnityEditor.Animations.AnimatorState state) { state.AddStateMachineBehaviour<" + item + @" > (); return true; }"); func(state); } } } // 记录未使用的状态 add by TangJian 2018/04/19 14:36:28 List <UnityEditor.Animations.AnimatorState> unuseAnimatorStates = new List <UnityEditor.Animations.AnimatorState>(); foreach (var state in animatorStateMachine.states) { int index = animatorControllerConfig.states.FindIndex((AnimatorState a) => { return(a.name == state.state.name); }); if (index < 0) { unuseAnimatorStates.Add(state.state); } } // 移除未使用的状态 add by TangJian 2018/04/19 14:38:34 foreach (var state in unuseAnimatorStates) { animatorStateMachine.RemoveState(state); } // 整理状态机位置 add by TangJian 2018/04/19 14:40:00 ChildAnimatorState[] childAnimatorStates = animatorStateMachine.states; int cols = 3; for (int i = 0; i < childAnimatorStates.Length; i++) { float x = (i % cols) * 204; float y = (i / cols) * 50; childAnimatorStates[i].position = new Vector3(x, y, 0); } animatorStateMachine.states = childAnimatorStates; // 保存生成的状态机 add by TangJian 2019/1/30 17:21 EditorUtility.SetDirty(animatorController); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } SupportEventDispatch(); }