6.角色跳跃

6.角色跳跃


6.1 知识点

要点分析

定义跳跃初始速度,重力加速度,实时速度,当前平台y值,二段跳计数变量

//初始跳跃时的 竖直上抛速度
public float initYSpeed = 10;
//重力加速度
public float G = 9.8f;
//跳跃当中 实时的速度是多少
private float nowYSpeed;
//当前平台的 Y 值
private float nowPlatformY;

//二段跳计数
private int jumpIndex;

在Update中写跳跃逻辑,按下空格且二段跳计数不是2时就可以跳跃。更改动画参数且设置Y速度,添加二段跳计数。

if(Input.GetKeyDown(KeyCode.Space) && jumpIndex != 2)
{
    //跳跃
    roleAnimator.SetBool("isJump", true);
    //当前Y速度 = 竖直上抛的初始速度
    nowYSpeed = initYSpeed;
    //二段跳计数 只能连续跳两次
    ++jumpIndex;
}

在Update中写检测如果跳跃动画参数是真,进行向上位移,每一帧都收到重力影响计算实时速度,使用公司v=v0-gt。如果实时速度小于0下落动画参数。每一帧判断是否落在了对应平台上,如果当前y值小于平台y值停止跳跃动画和下落动画,把y值拉回平台上,重置二段跳计数。

//跳跃状态时 Y 坐标的变化
if(roleAnimator.GetBool("isJump"))
{
    //位移逻辑
    this.transform.Translate(Vector3.up * nowYSpeed * Time.deltaTime);
    //收到重力加速度的影响 每一帧 都去改变当前的移动速度
    nowYSpeed -= G * Time.deltaTime;

    //当竖直方向的速度小于等于0 就应该播放 下落的动画
    roleAnimator.SetBool("isFall", nowYSpeed <= 0);

    //判断是否落在了对应平台上
    if( this.transform.position.y <= nowPlatformY)
    {
        //停止跳跃动画
        roleAnimator.SetBool("isJump", false);
        roleAnimator.SetBool("isFall", false);
        //避免下落时 落到"平台里" 把它拉回来
        Vector3 pos = this.transform.position;
        pos.y = nowPlatformY;
        this.transform.position = pos;
        //落地时才去清楚二段跳计数
        jumpIndex = 0;
    }
}

6.2 知识点代码

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

public class RoleObj : MonoBehaviour
{
    //移动速度
    public float moveSpeed = 5;
    //初始跳跃时的 竖直上抛速度
    public float initYSpeed = 10;
    //重力加速度
    public float G = 9.8f;
    //跳跃当中 实时的速度是多少
    private float nowYSpeed;
    //当前平台的 Y 值
    private float nowPlatformY;

    //二段跳计数
    private int jumpIndex;


    //动画控制相关组件
    private Animator roleAnimator;
    //输入移动相关的系数
    private float horizontalMove;
    
    void Start()
    {
        roleAnimator = this.GetComponent<Animator>();
    }
    
    void Update()
    {
        #region 移动相关逻辑
        //得到水平方向的输入 一般就是左右键输入
        //-1  0   1 三个值
        horizontalMove = Input.GetAxisRaw("Horizontal");
        //面朝左
        if (horizontalMove < 0)
            this.transform.rotation = Quaternion.Euler(0, -90, 0);
        else if (horizontalMove > 0)
            this.transform.rotation = Quaternion.Euler(0, 90, 0);
        //当有输入时,直接朝面朝向移动即可
        if (horizontalMove != 0)
            this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        //跑步动画的切换
        roleAnimator.SetBool("isRun", horizontalMove != 0);
        #endregion

        #region 跳跃逻辑
        if(Input.GetKeyDown(KeyCode.Space) && jumpIndex != 2)
        {
            //跳跃
            roleAnimator.SetBool("isJump", true);
            //当前Y速度 = 竖直上抛的初始速度
            nowYSpeed = initYSpeed;
            //二段跳计数 只能连续跳两次
            ++jumpIndex;
        }

        //跳跃状态时 Y 坐标的变化
        if(roleAnimator.GetBool("isJump"))
        {
            //位移逻辑
            this.transform.Translate(Vector3.up * nowYSpeed * Time.deltaTime);
            //收到重力加速度的影响 每一帧 都去改变当前的移动速度
            nowYSpeed -= G * Time.deltaTime;

            //当竖直方向的速度小于等于0 就应该播放 下落的动画
            roleAnimator.SetBool("isFall", nowYSpeed <= 0);

            //判断是否落在了对应平台上
            if( this.transform.position.y <= nowPlatformY)
            {
                //停止跳跃动画
                roleAnimator.SetBool("isJump", false);
                roleAnimator.SetBool("isFall", false);
                //避免下落时 落到"平台里" 把它拉回来
                Vector3 pos = this.transform.position;
                pos.y = nowPlatformY;
                this.transform.position = pos;
                //落地时才去清楚二段跳计数
                jumpIndex = 0;
            }

        }

        #endregion

    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏