用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:下(人物动画)

上个博客我们做出了人物的动画机和人物移动跳跃,接下来我们要做出人物展现出来的动画了

我们接下来就要用到动画机了,双击我们的动画机,进入到这样的页面,我这是已经做好的页面,你们是没有这些箭头的

依次像我一样连接起来,然后点击Parameters,点击name旁边的小箭头,选择 int 类型

之后我们随便选择一条线,点击Conditions的+, 选择如图所示的样子,选择state和Equals

然后就有所不同的:

  • 所有指向Idle的我们的值都设置为0;
  • 所有指向Move的,我们都设置为1;
  • 所有指向Jump的,我们都设置成2;
  • 所有指向Fall的,我们都设置成3。

把Has Exit Time勾选取消掉,就是不勾选,然后展开setting,把Transition Duratior的值都改为0


之后就可以进入我们的代码部分了,把我们之前的C#代码打开,改成这个

using Unity.VisualScripting;
using UnityEngine;

public class Move : MonoBehaviour
{
    // 定义私有变量rb,类型为Rigidbody2D,用于存储刚体组件的引用
    private Rigidbody2D rb;      
    // 定义私有变量coll,类型为BoxCollider2D,用于存储碰撞体组件的引用
    private BoxCollider2D coll;
    // 定义私有变量anim,类型为Animator,用于存储动画控制器组件的引用
    private Animator anim;
    // 定义公共变量JumpSpeed,类型为float,用于存储跳跃速度
    public float JumpSpeed = 5f;  
    // 定义公共变量MoveSpeed,类型为float,用于存储移动速度
    public float MoveSpeed = 5f;  
    // 定义公共变量Level,类型为float,用于存储水平输入值
    public float Level = 0f;

    // 定义私有变量JumpableGround,类型为LayerMask,用于存储可以跳跃的地面层
    [SerializeField] private LayerMask JumpableGround;

    // 定义一个名为MoveState的枚举,包含idle(静止)、run(跑步)、jump(跳跃)、fall(下落)四个状态
    private enum MoveState {idle, run, jump, fall}

    // Start方法在脚本实例化后、第一帧更新前被调用
    private void Start()
    {
        // 获取并赋值当前GameObject上的Rigidbody2D组件到rb变量
        rb = GetComponent<Rigidbody2D>();
        // 获取并赋值当前GameObject上的BoxCollider2D组件到coll变量
        coll = GetComponent<BoxCollider2D>();
        // 获取并赋值当前GameObject上的Animator组件到anim变量
        anim = GetComponent<Animator>();
    }

    // Update方法每帧调用一次
    private void Update()
    {
        // 获取水平方向的输入值,不进行平滑处理
        Level = Input.GetAxisRaw("Horizontal");
        // 设置角色的水平速度为Level乘以MoveSpeed,垂直速度保持不变
        rb.velocity = new Vector2(Level * MoveSpeed, rb.velocity.y);

        // 如果按下跳跃按钮并且角色在地面上
        if (Input.GetButtonDown("Jump") && IsGround()) 
        {
            // 设置角色的垂直速度为JumpSpeed,水平速度保持不变
            rb.velocity = new Vector2(rb.velocity.x, JumpSpeed);
        }
        // 调用UpdateStates方法来更新动画状态
        UpdateStates();
    }

    // UpdateStates方法用于更新角色的动画状态
    private void UpdateStates()
    { 
        // 定义一个MoveState类型的变量state
        MoveState state;

        // 根据水平输入值翻转角色
        if (Level > 0f)
        {
            // 如果输入值大于0,设置状态为run(跑步),并设置角色不翻转
            state = MoveState.run;
            this.gameObject.GetComponent<SpriteRenderer>().flipX = false;
        }
        else if (Level < 0f)
        {
            // 如果输入值小于0,设置状态为run(跑步),并设置角色翻转
            state = MoveState.run;
            this.gameObject.GetComponent<SpriteRenderer>().flipX = true;
        }
        else
        {
            // 如果没有水平输入,设置状态为idle(静止)
            state = MoveState.idle;
        }
        // 根据角色的垂直速度设置跳跃或下落状态
        if (rb.velocity.y > .1f)
        {
            // 如果垂直速度大于0.1,设置状态为jump(跳跃)
            state = MoveState.jump;
        }
        else if (rb.velocity.y < -.1f)
        {
            // 如果垂直速度小于-0.1,设置状态为fall(下落)
            state = MoveState.fall;
        }
        // 使用Animator组件设置名为"state"的整数参数,值为state的枚举整数值
        anim.SetInteger("state", (int)state);
    }

    // IsGround方法用于检测角色是否在地面上
    private bool IsGround()
    {
        // 使用Physics2D.BoxCast方法进行射线投射,检测角色下方是否有可以跳跃的地面层
        return Physics2D.BoxCast(coll.bounds.center, coll.bounds.size, 0f, Vector2.down, .1f, JumpableGround);
    }
}

这个代码是我在网上面找的,他用到的IsGroup()很精髓,如果我们不这么做,就需要自己设置IsGroup,之后true和false来回转换,还需要加Unity里面的碰撞体方法进行判断。

这里面就能看到我刚才为什么要让你们设置指向谁的必须是几了。

然后我们保存一下,回到我们的Unity,运行一下就可以看到我们人物的移

动动作和跳起动作了。


如果没有成功跳起来的话:

我们依次点击Tilemap——> Layer——>Add Layer..

添加一个Ground

回到Tilemap,选中Ground

点击Player,选择Move文件,点击Jumpable Ground 切换到Ground,如果这些部分不设置的话,可能我们C#代码里面的IsGround就用不了

最后:运行!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值