跳跃比控制方向移动稍微难一点
环境配置
1.新建2d项目
2.添加2d -> sprite作为物品设置sprite图片
4.给sprite添加rigidbody2d ,boxcollider2d
5.添加个2d -> sprite shape控件作为地板,添加boxcollider2d
因为有rigidbody所以我们只需要让物体上升就好了 ,物体会自己落下来

第一种
完全是按照方向移动的思路写的跳 ,发现物体瞬间移动到控制了
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
// 如果不加 Space.World如果物体旋转过 跳的方向就不是往上了 ,斜了
transform.Translate(new Vector3(0, 10, 0), Space.World);
}
}
如果使用MovePosition
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
var component = transform.GetComponent<Rigidbody2D>();
component.MovePosition(component.position + new Vector2(0, 5));
}
}第二种
缓慢上升 ,高度可用控制 ,代码有点多
private float speed = 30;
bool jump = false;
float jhigh = 0f;
float maxJhigh = 5f;
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
jump = true;
print("start");
jhigh = 0;
}
if (jump) {
float high = 1 * speed * Time.deltaTime;
if (jhigh + high >= maxJhigh) {
jump = false;
}
transform.Translate(new Vector3(0, high, 0), Space.World);
jhigh += high;
print(jhigh);
}
}
第三种
使用Force 施加力 ,有弹跳感 推荐这种
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
var component = transform.GetComponent<Rigidbody2D>();
component.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
}
优化版
添加射线检测 只能在地上才可以跳
// 用于在屏幕输出位置
private void OnDrawGizmos() {
Gizmos.color = Color.white;
Gizmos.DrawRay(transform.position + colliderOffset,Vector3.left);
}
void Update() {
RaycastHit2D onGround2 = Physics2D.Raycast(transform.position + colliderOffset, -Vector2.up);
print("b" + transform.position + ",c=" + colliderOffset + ",d=" + onGround2.distance);
if (onGround2.distance <= 0) {
if (Input.GetKeyDown(KeyCode.Space)) {
var component = transform.GetComponent<Rigidbody2D>();
component.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
}
}
优化2
上个版本的问题是 可能不是在地面 在别的隐藏的碰撞器上面 需要加上过滤
Debug.DrawRay(transform.position + colliderOffset, Vector3.down * 5);
if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W)) {
RaycastHit2D onGround2 = Physics2D.Raycast(transform.position + colliderOffset, -Vector2.up, 5, buildingsMask);
if (onGround2.collider != null && onGround2.distance <= 0) {
component.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
}
二阶段跳
/**
* 是否跳过一次
*/
private bool jumpOne;
void jump() {
Debug.DrawRay(transform.position + colliderOffset, Vector3.down * 5);
if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W)) {
RaycastHit2D onGround2 = Physics2D.Raycast(transform.position + colliderOffset, -Vector2.up, 5, buildingsMask);
if (onGround2.collider != null && onGround2.distance <= 0) {
rig.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
jumpOne = true;
}
else if (jumpOne) {
// 第二次跳
rig.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
jumpOne = false;
}
}
}
版权声明:本文为hewei314599782原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。