Вы можете использовать флаг, чтобы определить, когда игрок касается земли, и только прыгать, когда игрок касается пола.Это может быть установлено на true
и false
в функциях OnCollisionEnter
и OnCollisionExit
.
Создайте тег с именем «Ground» и заставьте GameObjects использовать этот тег, затем присоедините модифицированный код ниже кигрок, который делает прыжки.
private Rigidbody rb;
bool isGrounded = true;
public float jumpForce = 20f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
bool player_jump = Input.GetButtonDown("DefaultJump");
if (player_jump && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce);
}
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = true;
}
}
void OnCollisionExit(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = false;
}
}
Иногда использование OnCollisionEnter
и OnCollisionExit
может быть недостаточно быстрым.Это редко, но возможно.Если вы столкнетесь с этим, используйте Raycast с Physics.Raycast
для определения пола.Удостоверьтесь, что луч выброшен только на слой «Земля».
private Rigidbody rb;
public float jumpForce = 20f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
bool player_jump = Input.GetButtonDown("DefaultJump");
if (player_jump && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce);
}
}
bool IsGrounded()
{
RaycastHit hit;
float raycastDistance = 10;
//Raycast to to the floor objects only
int mask = 1 << LayerMask.NameToLayer("Ground");
//Raycast downwards
if (Physics.Raycast(transform.position, Vector3.down, out hit,
raycastDistance, mask))
{
return true;
}
return false;
}