在跳跃的时候,我们要先解决第一个问题,按什么按钮可以让人物跳跃
键盘一般使用空格,手柄一般使用下边的右侧下边的按钮,先来编辑一下按键,找到之前创建的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.跳跃的时候贴墙,一直按住左右方向键,人物会卡在墙上,因为我持续往这个方向有一个速度,松开后人物才会掉落