using System.Collections;
using System.Collections.Generic;
using UnityEditor.Animations;
using UnityEngine;
//所有的动画状态机的名称
enum AnimationIndex {
Run_SH,
Walk_SH
}
public class PlayerAnimation : MonoBehaviour {
public List<AnimatorController> allAnimators = new List<AnimatorController>();
private Animator playerAnimator;
public int animatorIndex=0;//这个是控制到底当前使用的是哪个动画控制器
//声明动画状态单元集合
AnimatorState[] states = new AnimatorState[2];
// Use this for initialization
void Start () {
playerAnimator = GetComponent<Animator >();
playerAnimator.runtimeAnimatorController = allAnimators[0];
// allAnimators
// Debug.Log(allAnimators [0].name );
}
//public float time = 3;
//private float timer = 0;
// Update is called once per frame
private Vector3 pos;
void Update () {
if (Input .GetKey (KeyCode.B )) {
if (animatorIndex == 0)
{
animatorIndex = 1;
}
else {
animatorIndex = 0;
}
}
//在这里执行对应的播放动画
AnimtorIndex(animatorIndex);
}
//通过枚举来判断当前该使用什么动画状态机
private void AnimatorNow(AnimationIndex animator)
{
switch (animator)
{
case AnimationIndex.Run_SH:
//问题可能出在切换动画控制器上了。
playerAnimator.runtimeAnimatorController = allAnimators[1];
//PlayerMove.instance.transform.Translate (Vector3 .forward );
SH_Animation.instance.Run_SHAnimation(PlayerMove.instance .h, PlayerMove.instance.v);
break;
case AnimationIndex.Walk_SH:
//我们在切换动画控制器的时候角色的位置又会回到初始位置,难道是动画控制器本身带有Tranform属性信息???
playerAnimator.runtimeAnimatorController = allAnimators[0];
// PlayerMove.instance.transform.Translate(Vector3.forward);
SH_Animation.instance.Walk_SHAnimation(PlayerMove.instance.h, PlayerMove.instance.v);
break;
}
}
//这是一个判断角色正在使用什么动作(走路或者跑步)的方法。
public void AnimtorIndex(int animatorIndex) {
switch (animatorIndex) {
case 0:
AnimatorNow(AnimationIndex.Walk_SH);
break;
case 1:
AnimatorNow(AnimationIndex.Run_SH );
break;
}
}
}
关键问题出在了 playerAnimator.runtimeAnimatorController = allAnimators[1];
我试过了,只要按下B键,角色的动画控制器被切换之后,不管角色的坐标位置在哪,都会跑到最初的位置上去。这个怎么解决啊?
在animator身上有一个apply root motion,把这个取消勾选了试试
一个状态机不能满足需求吗,还要使用两个来回切换