Unity动画控制

实现玩家角色根据不同状态播放不同动画,主要涉及动画有静置动画和移动动画,判断条件为不移动时播放静置动画,移动时播放移动动画。

增加动画控制器

设置静置动画、移动动画切换

增加参数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);
    }
}
相关推荐
_ZHOURUI_H_10 小时前
Unity TCP底层极限拆解:粘包、半包、CRC、序列号、双缓冲到底怎么一起工作的?
网络·网络协议·tcp/ip·游戏·unity·游戏引擎·游戏开发
KindSuper_liu14 小时前
Unity 游戏网络基础:从 TCP、UDP 到 HTTP、TLS 与 Best HTTP
网络·游戏·unity
qq_1702647515 小时前
unity里GameObject和Texture的内存归属
java·unity·游戏引擎
weixin_4046793117 小时前
godot + vscode ai开发
ide·vscode·编辑器·游戏引擎·godot
还是大剑师兰特1 天前
Unity3D(Unity)完整详细介绍
unity·游戏引擎
ellis19702 天前
u3d插件xLua[七]例6 Coroutine
unity
还是大剑师兰特2 天前
Unity 从零搭建简易3D场景(新手分步教程)
3d·unity·游戏引擎
神码编程2 天前
【Unity】TankBattle联机坦克大战(三)创建关卡(生成地块)
unity·游戏引擎·帧同步·坦克大战
淡海水2 天前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
神码编程2 天前
【Unity】TankBattle联机坦克大战(四)坦克的核心功能(上)
unity·游戏引擎·帧同步·坦克大战