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; } } }
|