欢迎光临散文网 会员登陆 & 注册

用unity制作一个宝可梦——2.制作玩家动画

2023-06-08 20:59 作者:立志看完尚硅谷  | 我要投稿

1.在window窗口中调出animation和animator,设置好玩家的Idle和Walk动画,采样频率统一设置为6

2.使用混合树创建好玩家的Idle和Walk

3.在代码中加入动画状态机,来控制角色正确播放动画


《PlayerController.cs》

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


//这是一个控制玩家的类,实现的功能有:

//1.上下左右移动

//2.播放移动动画


public class PlayerController : MonoBehaviour

{

  public float moveSpeed; //玩家的移动速度


  private bool isMoving; //是否处在移动

  private Animator animator; //定义玩家的动画的状态机


  private void Awake() //Awake():生命周期函数,当组件被实例化并启用时,该方法将在其它方法之前调用一次

  {

    animator = GetComponent<Animator>(); //获取到玩家的状态机

  }


  private void Update()

  {

    if (!isMoving)

    {

      var input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));

     


      if (input.x != 0) input.y = 0; //限制角色走斜线


      if (input != Vector2.zero) //如果输入的值不为0

      {

        //将输入的x,y值赋予给moveX,moveY,用来控制角色的动画状态

        animator.SetFloat("moveX",input.x);

        animator.SetFloat("moveY", input.y);


        var targetPos = transform.position; //targetPos:目标的位置

        targetPos.x += input.x;     //x方向加上垂直方向输入进来的值

        targetPos.y += input.y;     //y方向加上水平方向输入进来的值


        StartCoroutine(Move(targetPos)); //开启玩家移动的协程,将目标的位置作为参数传递过去

      }

    }


    animator.SetBool("isMoving",isMoving); //将isMoving的状态赋予给状态机

  }



  IEnumerator Move(Vector3 targetPos)

  {

    isMoving = true;


    // 循环判断当前位置与目标位置之间的距离是否大于一个很小的数值

    while ((targetPos - transform.position).sqrMagnitude > Mathf.Epsilon)

    {

      // 计算每帧应该移动的距离,并让物体朝目标位置移动一步

      transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);

      // 让程序等待下一帧再执行

      yield return null;

    }

    // 直接将物体移动到精确定位到目标位置上,避免偏差堆积

    transform.position = targetPos;


    isMoving = false;

  }

}

用unity制作一个宝可梦——2.制作玩家动画的评论 (共 条)

分享到微博请遵守国家法律