- 做2D动画,我们都知道用混合树做四个朝向的移动,但是,一旦松开按键,角色就会回到idle的朝向,我想让他朝右边移动后停下,依然朝向右边静止。
 - 我有八个动画,分别为runFront,runBack,runRight,runLeft,idleFront,idleBack,idleRight,idleLeft
 - 我希望,当我runRight后停下,播放idleRight的动画。而且想都用混合树处理,怎么做?
 - 先上代码
   
public class PlayerMove : MonoBehaviour
{
    private Animator anim;
  
    void Start()
    {
        anim = GetComponent<Animator>();
        anim.SetFloat("Horizontal2", 0);
        anim.SetFloat("Vertical2", -1);
    }
 
    void Update()
    {
        Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0f);
        anim.SetFloat("Horizontal", movement.x);
        anim.SetFloat("Vertical", movement.y);
        anim.SetFloat("Magnitude", movement.magnitude);
        transform.position = transform.position + movement * Time.deltaTime;
        if (movement.x > 0 && movement.y == 0)
        {
            anim.SetFloat("Horizontal2", 1);
            anim.SetFloat("Vertical2", 0);
        }
        if (movement.x < 0 && movement.y == 0)
        {
            anim.SetFloat("Horizontal2", -1);
            anim.SetFloat("Vertical2", 0);
        }
        if (movement.y > 0)
        {
            anim.SetFloat("Horizontal2", 0);
            anim.SetFloat("Vertical2", 1);
        }
        if (movement.y < 0)
        {
            anim.SetFloat("Horizontal2", 0);
            anim.SetFloat("Vertical2", -1);
        }
    }
}
  
- 首先,我建了两个混合树,一个是idleTree,一个是runTree,然后Entry的默认Transitions指向idleTree,这样一开始,动画就是idle的动画,并且我在void Start()里做了anim.SetFloat(“Horizontal2”, 0);anim.SetFloat(“Vertical2”, -1);这个是让一开始idleTree里的默认动画是朝向前面的。
 - idleTree指向runTree的transitions条件是Magnitude大于0,runTree指向idleTree的transitions条件是Magnitude小于0.001
 - idleTree里面的Parameters是Horizontal2和Vertical2,runTree里面的Parameters是Horizontal和Vertical
 - 这里处理的巧妙之处是用if处理Horizontal2和Vertical2的值,因为if判断完成后,这个值会一直维持这个数值,不会松手就回拨为0,但Horizontal和Vertical的值与movement.x和movement.y关联,所以,一松手就回拨为0
 - 借用if来处理,就解决这个问题了。
   
还有另一种更好的处理方式,变量只需要三个,不需要像上面一样的五个。 
 
public class PlayerMove : MonoBehaviour
{
    private Animator anim;
    private Rigidbody2D rb;
    public float speed;
    private float inputX;
    private float inputY;
    private Vector2 inputV;
    private float stopX;
    private float stopY;
    void Start()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        inputX = Input.GetAxisRaw("Horizontal");
        inputY = Input.GetAxisRaw("Vertical");
        inputV = new Vector2(inputX, inputY).normalized;
        if (inputV != Vector2.zero)
        {
            anim.SetBool("isMoving", true);
            stopX = inputX;
            stopY = inputY;
        }
        else
        {
            anim.SetBool("isMoveing", false);
        }
        anim.SetFloat("InputX", stopX);
        anim.SetFloat("InputY", stopY);
    }
    private void FixedUpdate()
    {
        rb.velocity = inputV * speed;
    }
}
 
                
                
                
        
    
 
 |