Убедитесь, что вы разрешаете прыгать только тогда, когда персонаж заземлен. Один из подходов к проверке этого заключается в использовании нисходящей лучевой трансляции и проверке, находится ли попадание ниже определенного порога:
void Update()
{
print(IsGrounded());
}
bool IsGrounded()
{
const float distanceToGround = 1f;
return Physics.Raycast(
transform.position, -Vector3.up, distanceToGround) != null;
}
Другой способ - использовать компонент CharacterController и проверить его bool:
CharacterController controller = null;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
print(controller.isGrounded);
}
Другой способ - прослушать событие столкновения и установить значение bool:
bool collides = false;
void FixedUpdate()
{
print(collides);
collides = false;
}
void OnCollisionStay(Collision collision)
{
collides = true;
}
Обратите внимание, что иногда полезно использовать юзабилити, чтобы дать немного свободы действий, чтобы пользователь мог прыгать, даже если он упал на землю. на несколько пикселей, или пропустите время на несколько миллисекунд. Удачи!