实现玩家角色根据不同状态播放不同动画,主要涉及动画有静置动画和移动动画,判断条件为不移动时播放静置动画,移动时播放移动动画。
增加动画控制器
设置静置动画、移动动画切换
增加参数isWalking
静置切换为移动
移动切换为静置
编辑代码PlayerMovement.cs
使用控制器改变isWalking参数值进而控制动画切换
csharp
using UnityEngine;
/// <summary>
/// 控制玩家角色的移动
/// </summary>
public class PlayerMovement : MonoBehaviour
{
/// <summary>
/// 玩家移动速度
/// </summary>
public float speed = 6f;
/// <summary>
/// 玩家刚体组件的引用
/// </summary>
private Rigidbody rb;
/// <summary>
/// 玩家动画组件的引用
/// </summary>
private Animator anim;
/// <summary>
/// 在对象激活时获取刚体和动画组件
/// </summary>
private void Awake()
{
rb = GetComponent<Rigidbody>();
anim = GetComponent<Animator>();
}
/// <summary>
/// 在固定时间间隔内处理物理移动、旋转和动画
/// </summary>
private void FixedUpdate()
{
// 获取水平和垂直方向的输入
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
// 移动角色
Move(h, v);
// 角色朝向鼠标指向位置
Turing();
// 播放行走动画
Animating(h, v);
}
/// <summary>
/// 根据输入移动角色
/// </summary>
/// <param name="h">水平输入</param>
/// <param name="v">垂直输入</param>
void Move(float h, float v)
{
// 计算移动向量
Vector3 movement = new Vector3(h, 0.0f, v);
// 移动玩家到新的位置
rb.MovePosition(transform.position + movement * speed * Time.fixedDeltaTime);
}
/// <summary>
/// 让角色朝向鼠标指向的地面位置
/// </summary>
void Turing()
{
// 创建一条从主摄像机到鼠标位置的射线
Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
// 获取地面层的LayerMask
int floorLayer = LayerMask.GetMask("Ground");
RaycastHit floorHit;
// 射线检测是否击中地面
bool isTouchFloor = Physics.Raycast(cameraRay, out floorHit, 100, floorLayer);
if (isTouchFloor)
{
// 计算角色到鼠标点击点的方向向量
Vector3 v3 = floorHit.point - transform.position;
v3.y = 0; // 保持水平方向
// 计算朝向该方向的旋转
Quaternion q = Quaternion.LookRotation(v3);
// 旋转角色
rb.MoveRotation(q);
}
}
/// <summary>
/// 根据输入设置动画参数,控制行走动画
/// </summary>
/// <param name="h">水平输入</param>
/// <param name="v">垂直输入</param>
void Animating(float h, float v)
{
// 判断是否有输入
bool isWalking = h != 0 || v != 0;
// 设置动画参数
anim.SetBool("isWalking", isWalking);
}
}