实现人物跳跃

在跳跃的时候,我们要先解决第一个问题,按什么按钮可以让人物跳跃

键盘一般使用空格,手柄一般使用下边的右侧下边的按钮,先来编辑一下按键,找到之前创建的Player input control的input system当中

先把下边的Look和Fire删掉,目前暂时还用不上

我们有了基本的移动以外,我们接下来创建一个跳跃的方法

我们点击action后面的“ + ”,起名字叫做Jump,一会我们就可以调用这个变量的名字来访问他

Jump的类型为button按钮类型保持不变

接下来添加

选择<No Binding>--path--Listen,在键盘上点击空格

选择Space[Keyboard]

勾选他的模板类型键盘鼠标KeyboardMouse

接下来添加手柄,连接手柄

在Jump后“ + ”添加一个Binding

path--【Listen--点击手柄上按键/搜索Button South[Gamepad]通用设置都选择Gamepad类型 】

点击保存,关闭窗口我们设计好了Jump,接下来通过c#访问这个类型,访问Jump来实现这个功能

像我们的人物移动一样,我们除了有人物的移动速度以外,我们也有我们跳跃的这个力,我们给他施加一个力,让他跳起来,继续写一下代码

首先我们来创建这个变量,创建一个float的变量起名为jumpForce,要施加一个力

【扩展内容:有时候在我们在一个代码当中创建非常多的变量,各种各样类型,我们在inspector窗口看起来会比较乱,我们可以用一些方法来进行快速的整理,例如我在上面创建一个分栏[Header("+文字") ]

保存代码,返回unity中

public class PlayerController : MonoBehaviour
{
    public Playerinputcontrol inputControl;//inputsystem,与控制有关的代码
    public Vector2 inputDirection;
    private Rigidbody2D rb;//创建刚体类型
    [Header("基本参数") ]
    public float speed;
    public float jumpForce;

unity的组件中出现中文注释

扩展内容完】

我们接下来要把jumpForce给到我们的Rigidbody当中,我们要用的方法就是在他的纵轴给他施加一个力(unity手册中的脚本API告诉我们写代码时如何解决问题,搜索Rigidbody2D,我们就可以看到公开变量,跳跃时我们使用公开函数AddForce施加一个力,这个函数有两个参数方向力和力的模式)(Rigidbody突然冲击的力,考虑其质量Mass,Mass越大,跳起越低)

接下来,我们开始写代码

我们跳跃的代码要什么时候执行,不可能在FixedUpdate或者Update当中让其持续执行,只有当按键被按下,才会执行

我们要使用新的inputsystem来获得按键被按下

通过Gameplay.Jump来获得

(为了方便查看,我们简单调整一下代码顺序,按住alt键+方向键就可以调整了)

/*cancle;按键取消。performed:按键持续按下的状态。started:按键被按下的那一刻(保证Jump的单次执行)
 他是一个事件的方法,那我们要添加一个事件注册函数,注册的内容就是用“+=”来进行注册,注册函数Jump(代表把这个函数方法添加到你按键按下的那一刻执行,也可以添加多个,按下后都会执行)*/

private void Awake()
{
    rb = GetComponent<Rigidbody2D>();//获得Rigidbody2D的组件
    inputControl = new Playerinputcontrol();
    inputControl.Gameplay.Jump.started += Jump;
        /*cancle;按键取消。performed:按键持续按下的状态。started:按键被按下的那一刻(保证Jump的单次执行)
         他是一个事件的方法,那我们要添加一个事件注册函数,注册的内容就是用“+=”来进行注册,注册函数Jump(代表把这个函数方法添加到你按键按下的那一刻执行,也可以添加多个,按下后都会执行)*/
}

Jump处显示,上下方没有出现过叫做Jump的函数,我可以点击代码前方,让他帮助我来进行快速修复,创建一个Jump函数

可以看到,代码中生成了我的注册函数

因为注册函数是有固定写法的,可以看到这个函数是有一个参数变量在括号当中,我们之前写的Move是没有任何参数在括号中的,这时候我们按下按键跳跃,他会传递进来一个我们inputAction的一个Callback的返回函数,在这里面,我们不需要修改callback的任何内容,不更改变量名字,调整一下函数的位置,到Move下方

在跳跃这里面我们就可以来执行了

先删去函数中间的内容,测试用键盘输入和手柄输入能不能执行

Debug.Log(" ");通常用来做Debug的一个方法,用来看函数执行到了哪个位置

写上这句话之后,保存代码,返回到unity中

 private void Jump(InputAction.CallbackContext context)//注册函数,固定模式Jump
 {
     Debug.Log("Jump");
 }

当我们按下按键空格,我们会在左下角的console窗口中看到(如果console窗口没有了,可以到window菜单--General--Console打开)

点击运行,人物落地,按一下空格,可以看到console窗口当中执行一句Jump,也用手柄进行测试

这样的话,我们就成功实现了

注释掉刚才的检测代码

我们要在刚体上添加一个向上方向的力transform.up

/*向上方向的力(世界坐标的向上方向的力)*跳跃的力
            现在这条命令就已经写好了,因为他有两个重载的方法,也就是说AddForce有两种写法,
            第一种写法是只给他一个方向
            第二种方法按方向键盘下,我们能看到后边还可以标注一个ForceMode
            ForceMode2D.Force普通的力,ForceMode2D.Inpulse瞬时的力*/

private void Jump(InputAction.CallbackContext context)//注册函数,固定模式Jump
{
    //Debug.Log("Jump");
    rb.AddForce(transform.up*jumpForce,ForceMode2D.Impulse);
}

保存代码,返回unity

我们刚才创建了我们的jumpForce,但是我们并没有给力

Player下的JumpForce改为16.5,测试一下(16或者16.5,也可以自己去测试一下)

按下空格,人物起飞

还需要更改一下人物的重力加速度Rigidbody2D--Gravity Scale改为4(可以自己调试)

我们跳跃的力和我们的重力相互抵消之后,找到一个很棒的跳跃的感觉

还存在一些问题,

1.跳跃的时候可以一直跳,每次点击空格都可以跳跃

在空中不可以一直跳跃,空中的某种情况下可以实现二段跳

2.在跳跃过程中可以移动方向

3.跳跃的时候贴墙,一直按住左右方向键,人物会卡在墙上,因为我持续往这个方向有一个速度,松开后人物才会掉落

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值