Unity:人物跳跃动画的切换

Unity实现动画切换的原理:
Entry所指的橘黄色状态为默认状态。记住, Entry在Animator组件被激活后 无条件 跳转到默认状态,并且每个Layer有且仅有一个默认状态

在Animator中,我们可以给状态添加指定参数,当参数满足条件时便可实现动画的切换。
在这里插入图片描述
代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Rigidbody2D rb;
    public float speed;
    public float jumpforce;
    public Animator anim;
    public Collider2D coll;
    public LayerMask ground;
    
    void Start()
    {
        
    }
    private void Update()
    {
        if (Input.GetButtonDown("Jump"))
        {
            float t = 1 / Time.deltaTime;
            rb.velocity = new Vector2(rb.velocity.x, jumpforce*Time.deltaTime*t);
            anim.SetBool("jumping", true);
        }
        SwitchAnim();

        //SwitchAnim();//为什么不可以放在上面?

    }
    void FixedUpdate()
    {
        Movement();
    }
    void Movement()
    {
        float horizontalMove= Input.GetAxis("Horizontal"); ;
        float faceDirection = Input.GetAxisRaw("Horizontal");

        //角色移动
        if (horizontalMove != 0)
        {
            rb.velocity = new Vector2(horizontalMove * speed, rb.velocity.y);
            anim.SetFloat("running",Mathf.Abs(horizontalMove));
            Debug.Log(horizontalMove);
        }
        if (faceDirection != 0)
        {
            transform.localScale = new Vector3(faceDirection*0.693f, 0.6163f, 1);
        }
       
    }

    void SwitchAnim()
    {
        anim.SetBool("idleing", false);
        if (anim.GetBool("jumping"))
        {
            if (rb.velocity.y < 0)
            {
                anim.SetBool("jumping", false);
                anim.SetBool("falling", true);
            }
        }else if (coll.IsTouchingLayers(ground))
        {
            anim.SetBool("falling", false);
            anim.SetBool("idleing", true);
        }
    }
}

解释:

anim.SetBool(string name,bool value)

第一个参数为参数名,第二个为参数值

anim.GetBool(string name)

获取参数值

isTouchingLayer(LayeraMask LayerName)

检查附加到该刚体的任何碰撞体是否正在接触指定 LayerMask 上的任何碰撞体。(例如给地面自定义层,给人物添加LayerMask属性,和Box Colider 2D组件和属性,便可以将地面的层添加进角色属性LayerMask,从而使用isTouchingLayer判断是否接触了地面)

实现逻辑:
在这里插入图片描述

  1. walk和idle都可以切换为jump动画,参数条件为jumping:true
  2. jump切换为fall,参数条件为jumping:false;falling:true
  3. fall切换为idle,参数条件为idleing:true;falling:false
    (其实上述参数并不需要那么多,只不过可以更好地理解)
  4. 当我们按下空格应当进入跳跃动画,然后执行动画切换函数。
//跳跃函数
if (Input.GetButtonDown("Jump"))
        {
            float t = 1 / Time.deltaTime;
            rb.velocity = new Vector2(rb.velocity.x, jumpforce*Time.deltaTime*t);
            anim.SetBool("jumping", true);
            SwitchAnim();
        }
        
 //动画切换函数       
void SwitchAnim()
    {
        anim.SetBool("idleing", false);
        if (anim.GetBool("jumping"))
        {
            if (rb.velocity.y < 0)
            {
                anim.SetBool("jumping", false);
                anim.SetBool("falling", true);
            }
        }else if (coll.IsTouchingLayers(ground))
        {
            anim.SetBool("falling", false);
            anim.SetBool("idleing", true);
        }
    }
  1. 跳起后,先检测是否为jumping参数是否为true(因为动画变换函数一定是在跳起之后)
  2. 上升和下降动画的分界点是垂直方向速度<0,即像下落。然后设置下降动画满足的参数条件
  3. 如果不是跳跃状态并且接触了地面则满足变为idle动画的条件
  4. 但是要注意吧把dle参数及时复原,所以变换函数的开头加入复原语句

解释:
为什么不可以吧SwitchAnim函数放入判断跳跃的if条件句中?

这样的话只有在跳跃键按下的一瞬间才执行,起跳后动画变换函数根本不执行

为什么不把判断是否接触地面的的判断语句继续嵌套在垂直速度小于0的判断语句中?

显然不行,速度小于零后,还有一段距离才到地面,这样if立马判断为假,所以不执行,而落地后速度又为零也不执行,并且jumping参数也不再满足(这样就一次空格只执行一次)

为什么要复原idleing?

良好的习惯,状态结束一般要复原

总结:
像是这样分阶段的过程最好分阶段写函数:

  1. 先是跳跃,然后动画变换
  2. 先跳跃下降,在落地

落地的layer:
在这里插入图片描述

如果强行嵌套也可以这样:
代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Rigidbody2D rb;
    public float speed;
    public float jumpforce;
    public Animator anim;
    public Collider2D coll;
    public LayerMask ground;
    
    void Start()
    {
        
    }
    private void Update()
    {
        if (Input.GetButtonDown("Jump"))
        {
            float t = 1 / Time.deltaTime;
            rb.velocity = new Vector2(rb.velocity.x, jumpforce*Time.deltaTime*t);
            anim.SetBool("jumping", true);
        }
        SwitchAnim();


    }
    void FixedUpdate()
    {
        Movement();
    }
    void Movement()
    {
        float horizontalMove= Input.GetAxis("Horizontal"); ;
        float faceDirection = Input.GetAxisRaw("Horizontal");

        //角色移动
        if (horizontalMove != 0)
        {
            rb.velocity = new Vector2(horizontalMove * speed, rb.velocity.y);
            anim.SetFloat("running",Mathf.Abs(horizontalMove));
            Debug.Log(horizontalMove);
        }
        if (faceDirection != 0)
        {
            transform.localScale = new Vector3(faceDirection*0.693f, 0.6163f, 1);
        }
       
    }

    void SwitchAnim()
    {
        anim.SetBool("idleing", false);
        //if (anim.GetBool("jumping"))
        //{
            if (rb.velocity.y <= 0)
            {
                anim.SetBool("jumping", false);
                anim.SetBool("falling", true);
                if (coll.IsTouchingLayers(ground))
                {
                    anim.SetBool("falling", false);
                    anim.SetBool("idleing", true);
                }
            }

        //}
    }
}

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity是一款强大的游戏引擎,可以用于创建各种类型的游戏。其中,人物模型带动画Unity中常见的一种开发需求。 首先,我们需要一个人物模型。可以通过购买或者下载免费的人物模型资源,也可以自己进行建模。Unity支持多种3D模型格式,常见的有FBX、OBJ等。将人物模型导入Unity项目中。 接下来,我们需要为人物模型添加动画Unity内置了Animator组件,用于管理和播放动画。在编辑界面中,我们可以创建动画控制器,并将其和人物模型关联起来。动画控制器是一个状态机,可以根据不同的输入切换不同的动画状态。 在动画控制器中,我们可以创建不同的动画状态,并为每个状态指定对应的动画剪辑。动画剪辑是一个包含动画数据的资源,可以使用Unity内置的动画编辑器或第三方工具进行创建。常见的动画剪辑包括行走、跑步跳跃、攻击等。 除了使用动画剪辑播放动画外,我们还可以通过代码控制人物模型的动画。通过Animator组件提供的API,我们可以在脚本中设置动画的各种参数,如播放速度、过渡时间等。这样,我们可以根据游戏逻辑动态地改变人物动画状态。 最后,在游戏运行时,我们可以通过控制人物模型的移动、跳跃、攻击等操作,来触发对应的动画状态,并播放相应的动画剪辑。这样就实现了Unity人物模型的带动画效果。 总之,Unity提供了丰富的功能来支持人物模型的动画开发,包括导入模型、创建动画控制器、编辑动画剪辑、通过脚本控制动画等。开发者可以根据自己的需求和创意,灵活运用这些功能,打造出丰富多样的游戏角色动画

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值