//获取角色动画参数 public AnimationControlParamter GetAnimationParamter(string animationName) { AnimationControlParamter paramter = new AnimationControlParamter(); AnimationClip[] clips = anim.runtimeAnimatorController.animationClips; for (int i = 0; i < clips.Length; i++) { if (clips[i].name == animationName) { if (clips[i].wrapMode == WrapMode.Loop) { paramter.bLoop = true; } else { paramter.bLoop = false; } break; } } UnityEditor.Animations.AnimatorController ac = anim.runtimeAnimatorController as UnityEditor.Animations.AnimatorController; //获取状态机 UnityEditor.Animations.AnimatorStateMachine asm = ac.layers[0].stateMachine; for (int i = 0; i < asm.states.Length; i++) { UnityEditor.Animations.ChildAnimatorState cs = asm.states[i]; if (cs.state.name == animationName) { paramter.timeScale = cs.state.speed; break; } } return(paramter); }
//设置角色动画参数 public void SetAnimationParamter(string animationName, AnimationControlParamter paramter) { //获取所有动画片段 AnimationClip[] clips = anim.runtimeAnimatorController.animationClips; for (int i = 0; i < clips.Length; i++) { if (clips[i].name == animationName) { if (paramter.bLoop) { clips[i].wrapMode = WrapMode.Loop; } else { clips[i].wrapMode = WrapMode.Default; } } } UnityEditor.Animations.AnimatorController ac = anim.runtimeAnimatorController as UnityEditor.Animations.AnimatorController; //获取状态机 UnityEditor.Animations.AnimatorStateMachine asm = ac.layers[0].stateMachine; for (int i = 0; i < asm.states.Length; i++) { UnityEditor.Animations.ChildAnimatorState cs = asm.states[i]; if (cs.state.name == animationName) { cs.state.speed = paramter.timeScale; } } }
/// <summary> /// Sets the animation clip as default animator state and plays it. /// </summary> /// <param name="animClip">Animation clip to play</param> /// <returns>true on success, false otherwise</returns> public bool PlayAnimationClip(AnimationClip animClip) { string animClipName = animClip != null ? animClip.name : string.Empty; if (playerAnimator && animClip) { #if UNITY_EDITOR RuntimeAnimatorController animatorCtrlRT = playerAnimator.runtimeAnimatorController; UnityEditor.Animations.AnimatorController animatorCtrl = animatorCtrlRT as UnityEditor.Animations.AnimatorController; UnityEditor.Animations.ChildAnimatorState[] animStates = animatorCtrl.layers.Length > 0 ? animatorCtrl.layers[0].stateMachine.states : new UnityEditor.Animations.ChildAnimatorState[0]; bool bStateFound = false; for (int i = 0; i < animStates.Length; i++) { UnityEditor.Animations.ChildAnimatorState animState = animStates[i]; if (animState.state.name == animClipName) { animatorCtrl.layers[0].stateMachine.states[i].state.motion = animClip; animatorCtrl.layers[0].stateMachine.defaultState = animatorCtrl.layers[0].stateMachine.states[i].state; bStateFound = true; break; } } if (!bStateFound && animatorCtrl.layers.Length > 0) { UnityEditor.Animations.AnimatorState animState = animatorCtrl.layers[0].stateMachine.AddState(animClipName); animState.motion = animClip; animatorCtrl.layers[0].stateMachine.defaultState = animState; } #endif } if (playerAnimator && animClipName != string.Empty) { transform.position = initialPos; transform.rotation = initialRot; playerAnimator.Play(animClipName); return(true); } return(false); }