- 做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;
}
}
|