P-17 跟Alex Dev老师的课程利用unity从零开始学习做横版2D游戏的学习笔记----包含原代码部分和个人见解

Jump animation

红色为相较于上节新增的代码部分,本p主要讲解在unity中的动画器中创建混合树。来使得2D横版小人在跳起拥有一个动作,在跳起后下落的过程业拥有一个动作。

在上面创建的混合树之中,我们加入跳起动画和下落动画。并将混合树的参数设置为yVelocity,以便得知此时刚体的状态,当这个参数大于0时,激活跳跃动画,反之则反。

上图为动画器中的连接结构,如果此时我们位于地面(此时的isGrounded为true),当我们按下跳跃键的时候,isGrounded变为flase,连接传递的条件达成(上图右下角),图中的Any state会传入信息给Jump/Fall(也就是我们的混合树),激活刚体动作。

public class player : MonoBehaviour
{
    private Rigidbody2D rb;
    // rb目前处于未被初始化的状态,值为null,不能被调用,不指向任何对象。

    private Animator anim;

    [SerializeField]private float moveSpeed;

    [SerializeField]private float jumpForce;

    private float xInput;

    private int facingDirection = 1;

    private bool facingRight = true;


    [Header("Collision info")]

    [SerializeField] private float groundCheckDistance;

    [SerializeField] private LayerMask whatIsground;

    private bool isGrounded;

    
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();

        anim = GetComponentInChildren<Animator>();
    }

    
    void Update()
    {
        Movement();

        CheckInput();

        CollisionCheck();

        FlipController();

        AnimatorControllers();

    }

    private void CollisionCheck()
    // 如果 groundCheckDistance 碰到地面就是true,没有碰到地面是 flase
    {
        isGrounded = Physics2D.Raycast(transform.position, Vector2.down, groundCheckDistance, whatIsground);
    }

    private void CheckInput()
    {
        xInput = Input.GetAxisRaw("Horizontal");
        // 设置 x 的输入,获得移动的机会

        if (Input.GetKeyDown(KeyCode.Space))
        // 如果输入 空格 就会进行跳跃
        {
            Jump();
        }
    }

    private void Movement()
    // 移动由 x 输入 和 移动速度控制
    {
        rb.velocity = new Vector2(xInput * moveSpeed, rb.velocity.y);
    }

    private void Jump()
    // 跳跃由跳跃强度控制
    {
        if (isGrounded)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        }
    }

    private void AnimatorControllers() 
    // 动画控制器控制动画的播出
    {

        bool isMoving = rb.velocity.x != 0;

        anim.SetFloat("yVelocity", rb.velocity.y);

        anim.SetBool("isMoving", isMoving);
        // 1.调用 Animator = anim 组件中的 SetBool 方法,将 isMoving 参数的值设置到 Animator 组件中
        // 2.后面的 isMoving 这个变量的值将被传递给 SetBool 方法,用于设置 "isMoving" 参数的值
        // 要求:player或者其子对象Animitor中必须有一个 Animator 的组件,并且Animator Controller中必须有一个名为 isMoving 的布

        anim.SetBool("isGrounded", isGrounded);

    }

    private void Flip() 
    // 进行角色翻转
    {
        facingDirection = facingDirection * -1;

        facingRight = !facingRight;

        transform.Rotate(0, 180, 0);

    }

    private void FlipController() 
    // 角色翻转控制器
    {
        if (rb.velocity.x > 0 && !facingRight)
        {
            Flip();
        }
        else if(rb.velocity.x < 0 && facingRight) 
        { 
            Flip();
        }

    }

    private void OnDrawGizmos()
    {
        Gizmos.DrawLine(transform.position, new Vector3(transform.position.x, transform.position.y - groundCheckDistance));
    }


}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值