07 跳跃动画Layer Mask

增加起跳和下落动画,素材文件是:

把四个动画的关系理顺:

增加两个参数 Jumping 和 Falling。

把指向 Jump 的两条线的 Settings 按如下设置:

然后都增加一个 Jumping 为 true 的条件。

在角色跳跃的时候增加一条动画转换代码:

专门写一个起跳到落下的函数逻辑:

SwitchAnim 放在 FixedUpdate 中与 Movement 一起执行。到这里,已经完成了起跳 -> 下落的转变,但是下落到站立的动画还没有实现。

下落到站立,即角色与地面相接触就变为站立动画,那么需要对是否接触到地面进行判断。

给 Tilemap 的 ground 增加一个 Layer:

在脚本中定义一个 LayerMask 变量

然后在脚本组件界面就可以看到这个变量了,选择刚刚添加的 Layer。

这里的 Layer 就是作为碰撞监测的一种方案。

那么在代码中首先需要获取到角色的 Collider 2D,定义变量:

然后在 SwitchAnim 函数中写和地面接触的逻辑:

这样在与地面接触时动画状态就变成站立了。

到此,所有的动画及其转化逻辑已经全部实现(不包括优化跳跃和移动手感)。

目前为止的完整代码:

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

public class PlayerControler : MonoBehaviour
{
    public Rigidbody2D rb;
    public Animator anim;
    public float speed;
    public float jumpForce;
    public LayerMask ground;
    public Collider2D coll;
    // Start is called before the first frame update
    void Start()
    {
    
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        Movement();
        SwitchAnim();
    }

    void Movement(){
        float horizontalMove = Input.GetAxis("Horizontal");
        float faceDirrection = Input.GetAxisRaw("Horizontal");

        // 角色移动
        rb.velocity = new Vector2(horizontalMove * speed * Time.deltaTime, rb.velocity.y);
        anim.SetFloat("Running", Mathf.Abs(faceDirrection)); // 绝对值
        if(faceDirrection != 0){
            transform.localScale = new Vector3(faceDirrection, 1, 1);
        }

        // 角色跳跃
        if(Input.GetButtonDown("Jump")){
            rb.velocity = new Vector2(rb.velocity.x, jumpForce * Time.deltaTime);
            anim.SetBool("Jumping", true);
        }
    }

    void SwitchAnim ()
    {
        anim.SetBool("Idling", 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("Idling", true);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值