Как указано в комментариях, я думаю, что основная проблема связана с этой строкой кода.
if (jump == true && grounded == true && jumptime > 0)
Весьма вероятно, что один из этих bool - это не то, что вы ожидаете.В любом случае я предлагаю вам преобразовать строку следующим образом:
if (jump && grounded && jumptime > 0)
Вам не нужно == true для логических значений.
В любом случае, чтобы решить ваш вопрос более простым способом, я бы предложилвы должны использовать AddForce вместо move (потому что вы все равно используете rigibody2d).
rb2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
Небольшое примечание о горизонтальной скорости.Если вы используете ригбоди, было бы лучше переместить его с тем же твердым телом, а не с преобразованием:
rb2D.MovePosition(rb2D.position + Vector2.left * xspeed * Time.fixedDeltaTime);
Ваш код станет:
public class PlayerController2D : MonoBehaviour
{
private Rigidbody2D rb2D;
private Vector2 velocity;
public float jumpForce = 5;
bool grounded = true;
void Start() { rb2D = GetComponent<Rigidbody2D>(); }
void Update()
{
if (Input.GetButton("Jump") && grounded)
rb2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
//calculate horizontal speed here
xspeed = ...;
}
private void FixedUpdate()
{
rb2D.MovePosition(rb2D.position + Vector2.left * xspeed * Time.fixedDeltaTime);
}
void OnCollisionExit2D(Collision2D other)
{
Debug.Log("No longer in contact with " + other.transform.name);
grounded = false;
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Terrain")
{
Debug.Log("Landed");
grounded = true;
}
}
}