-
首先实现跳跃是在已经实现游戏角色左右移动的基础上
实现游戏角色移动的脚本 -
在脚本完成后需要将图层设置为Ground,使代码知道地面是哪一个图层。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
//获得角色刚体
private Rigidbody2D rb;
//获得角色碰撞器,游戏需要所以特别使用方形的collider
private BoxCollider2D coll;
[Header("移动参数")]
//设定角色的移动速度
public float speed = 8f;
[Header("跳跃参数")]
//声明一个跳跃的力
public float jumpForce = 6.3f;
//当长按按键时加成的跳跃的力
public float jumpHoldFroce = 1.9f;
//长按跳跃按键可以按多长时间
public float jumpHoldDuration = 0.1f;
//记录跳跃的时间
float jumpTime;
[Header("状态")]
//游戏角色是否站在地上的状态
public bool isOnGround;
//游戏角色是否处于跳跃的状态
public bool isJump;
[Header("环境检测")]
//用来判断哪一个是地面的图层
public LayerMask groundLayer;
//按键的设置
bool jumpPressed;//单次跳跃
bool jumpHeld;//长按跳跃
void Start()
{
//GetComponent< >():获取对象中指定类型的控件(脚本)
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<BoxCollider2D>();
}
void Update()
{
//给跳跃按键进行赋值
jumpPressed = Input.GetButtonDown("Jump");
jumpHeld = Input.GetButton("Jump");
}
//写好的函数需要在FixedUpdate()中进行调用
private void FixedUpdate()
{
//先调用物理环境判断游戏角色是否在地面上
PhysicsCheck();
//在游戏角色跳跃之前调用游戏角色移动的函数,此脚本函数在游戏角色移动的脚本查看
GroundMovement();
//调用游戏角色跳跃的函数
MidAirMovement();
}
//物理环境判断的函数
void PhysicsCheck()
{
//判断游戏角色是否处于isOnGround状态
if(coll.IsTouchingLayers(groundLayer))
isOnGround = true;
else isOnGround = false;
}
//跳跃有关的函数
void MidAirMovement()
{
//1.判断角色在地面的同时按下了jump,并且角色不处于跳跃状态
if(jumpPressed && isOnGround && !isJump)
{
//2.跳跃的状态变成true,是否处于地面上变成false
isOnGround = false;
isJump = true;
//计算跳跃的时间
jumpTime = Time.time + jumpHoldDuration;
//2.添加跳跃的力使角色跳跃起来
rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
}
//3.判断如果现在是跳跃的状态
else if (isJump)
{
//4.持续按住跳跃
if (jumpHeld)
//5.添加持续跳跃的力
rb.AddForce(new Vector2(0f, jumpHoldFroce), ForceMode2D.Impulse);
//判断如果跳跃时间小于真实的时间
if (jumpTime < Time.time)
isJump = false;
}
}
AddForce( )
AddForce()是Rigidbody的一个方法:添加一个力到刚体。
使用方式:
rb.AddForce(x, y);
ForceMode2D.Impulse:突然产生的力。
跳跃代码逻辑:
- 先声明跳跃相关的参数、角色状态参数、环境检测参数、按键的设置。
- 对按键进行赋值、书写环境检测函数、书写游戏角色跳跃函数。
- 写好的函数需要在FixedUpdate()中进行调用,调用的时候要先对物理环境进行检测。