0%

Unity_2D_Jump

JUMP

关于用unity开发2D跳跃游戏的一些思路

Case 01:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//跳跃最基础的实现方法:当空格按下时,给刚体一个向上的力
//缺陷:连按空格人会一直向上,下落的时候看起来人是飘飘的
public class Jump : MonoBehaviour
{
public float jumpForce = 5f;

private Rigidbody2D _rigidbody2D;
private bool jumpRequest;

void Start()
{
_rigidbody2D = GetComponent<Rigidbody2D>();
}

private void Update()
{
if(Input.GetButtonDown("Jump"))
{
jumpRequest = true;
}
}
private void FixedUpdate()
{
if(jumpRequest)
{
//ForceMode2D.Impulse
_rigidbody2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
jumpRequest = false;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//改进:点按和长按空格,起跳的速度不一样
//通过刚体当前的速度来判断是在上升还是在下落,给刚体不同的重力大小
public class JumpTest : MonoBehaviour
{
public float jumpForce = 5f;
public float fallMultiplier = 2.5f;
public float lowJumpMultiplier = 2f;

private Rigidbody2D _rigidbody2D;
private bool jumpRequest;

void Start()
{
_rigidbody2D = GetComponent<Rigidbody2D>();
}

private void Update()
{
if(Input.GetButtonDown("Jump"))
{
jumpRequest = true;
}
}
private void FixedUpdate()
{
if(jumpRequest)
{
_rigidbody2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
jumpRequest = false;
}

//当刚体在下落时
if (_rigidbody2D.velocity.y < 0)
{
_rigidbody2D.gravityScale = fallMultiplier;
}
//当刚体在上升时,且空格不是按下的状态
else if (_rigidbody2D.velocity.y > 0 && !Input.GetButton("Jump"))
{
_rigidbody2D.gravityScale = lowJumpMultiplier;
}
else
{
_rigidbody2D.gravityScale = 1f;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//改进:增加角色与环境的碰撞检测,解决角色可以在空中无限跳跃的问题
public class JumpBox : MonoBehaviour
{
[Range(0, 10)] public float jumpForce = 5f;
public LayerMask mask;
public float boxHeight = 0.5f;

private Vector2 playerSize;
private Vector2 boxSize;

private bool jumpRequest = false;
private bool grounded = false;

public float fallMultiplier = 2.5f;
public float lowJumpMultiplier = 2f;

private Rigidbody2D _rigidbody2D;

void Start()
{
_rigidbody2D = GetComponent<Rigidbody2D>();
playerSize = GetComponent<SpriteRenderer>().bounds.size;
boxSize = new Vector2(playerSize.x * 0.5f, boxHeight);
}

void Update()
{
//当角色在地面按下空格时
if (Input.GetButtonDown("Jump") && grounded)
{
jumpRequest = true;
}
}

private void FixedUpdate()
{
if (jumpRequest)
{
_rigidbody2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);

jumpRequest = false;
grounded = false;
}
//否则,为了让角色在其他情况下按空格都不会跳起来,需要检测角色是否在地面上
else
{
//检测盒子的中心是角色的脚底
Vector2 boxCenter = (Vector2)transform.position + (Vector2.down * playerSize * 0.5f);

//
if (Physics2D.OverlapBox(boxCenter, boxSize, 0, mask) != null)
{
grounded = true;
}
else
{
grounded = false;
}
}

if (_rigidbody2D.velocity.y < 0)
{
_rigidbody2D.gravityScale = fallMultiplier;
}
else if (_rigidbody2D.velocity.y > 0 && !Input.GetButton("Jump"))
{
_rigidbody2D.gravityScale = lowJumpMultiplier;
}
else
{
_rigidbody2D.gravityScale = 1f;
}
}
}