一、跳跃功能基本实现
二、跳跃bug解决
三、跳跃优化
一、跳跃功能基本实现
在unity中我们要实现跳跃功能基本依赖代码实现。在这里我们先构建场景,笔者在这里使用tilemap构建地面,创建正方形代表物体。如图所示
我们要为其添加代码,我在这创建名为Control.cs的C#脚本,用来控制正方形的行为,将其绑定到正方形组件上,同时为正方形添加rigidbody2d和boxcollider组件,将rigidbody2d中z轴锁定。并且也为tilemap添加组合碰撞体和tilemapcollider,将tilemapcollider中Use by Composite打钩,使用tilemap组合碰撞体,调整碰撞区域,锁定x,y,z轴。同时为了方便,引入Cinemachine跟随正方形,以便实时观察。
Control.cs的代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Control : MonoBehaviour
{
//声明刚体组件
Rigidbody2D rigidbody;
//力大小
float force = 300.0f;
void Start()
{
//获取刚体组件
rigidbody = GetComponent<Rigidbody2D>();
}
void Update()
{
//如果按下W,实现跳跃功能
if (Input.GetKeyDown(KeyCode.W))
{
Jump();
}
}
void Jump()
{
//对物体施加方向向上的力,也可以对rigidbody.velocity进行操作,但是不推荐
rigidbody.AddForce(Vector2.up * force);
}
}
这样基本的跳跃功能我们就实现了。
二、跳跃bug解决
在运行中,我们很快就能发现一个问题,只要我们多次按W键,它就能一直跳跃,这当然不符合实际情况。我们需要代码监测它是否在地面上。我们可以重载OnCollisionEnter2D和OnCollisionExit2D来监测它是否在地面上。
首先,我们要把tilemap的tag设置为Ground,没有的自行添加。
将代码修改为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Control : MonoBehaviour
{
//声明刚体组件
Rigidbody2D rigidbody;
//力大小
float force = 300.0f;
//设置是否可以跳跃的bool值,初始值为true
bool jumpable = true;
void Start()
{
//获取刚体组件
rigidbody = GetComponent<Rigidbody2D>();
}
void Update()
{