Я делаю простую игру, используя персонажа и физику. Персонаж использует капсульный коллайдер.Мне удалось заставить персонажа двигаться, добавив силы, ограничив их, чтобы они не достигли огромных значений, и добавил противоположные силы, когда не нажимаются никакие клавиши перемещения (было и d), чтобы персонаж останавливался быстрее.Добавлено несколько анимаций в конце.Проблема в том, что я добавил ландшафт к сцене и добавил к ней немного высоты.Всякий раз, когда я достигаю вершины и продолжаю нажимать «w», чтобы двигаться вперед, мой персонаж теряет контакт с горном и начинает летать в основном, хотя он медленно начинает снижаться (слишком медленно).Когда я перестаю нажимать «w», гравитация снова начинает работать, и объект начинает падать с нормальной скоростью.Может кто-нибудь помочь?
public class PlayerController : MonoBehaviour {
public Animator anim;
public Rigidbody rb;
public float speed;
public float rotationSpeed;
public float maxSpeed;
public float maxRotationSpeed;
void Start () {
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody>();
}
void Update () {
//Manage animations
if (Input.GetKey("w"))
{
anim.SetBool("isWalking", true);
}
else
{
anim.SetBool("isWalking", false);
}
}
void FixedUpdate()
{
//Get input
float moveHorizontal = Input.GetAxis("Horizontal") * Time.deltaTime;
float moveVertical = Input.GetAxis("Vertical") * Time.deltaTime;
//Add forces to object
rb.AddRelativeForce(new Vector3 (0.0f, 0.0f, moveVertical) * speed);
rb.AddTorque(transform.up * moveHorizontal * rotationSpeed);
//Limit velocity and rotation
if (Vector3.Magnitude(rb.velocity) > maxSpeed)
{
rb.velocity = Vector3.ClampMagnitude(rb.velocity, maxSpeed);
}
if (rb.angularVelocity.magnitude > maxRotationSpeed)
{
rb.angularVelocity = Vector3.ClampMagnitude(rb.angularVelocity, maxRotationSpeed);
}
//Stop object if no movement key is being pressed
if (!Input.GetKey("w") && rb.velocity.magnitude > 0.0001 && Vector3.Dot(rb.transform.forward,rb.velocity.normalized) > 0)
{
rb.velocity = Vector3.zero;
}
if (!Input.GetKey("s") && rb.velocity.magnitude > 0.0001 && Vector3.Dot(rb.transform.forward, rb.velocity.normalized) < 0)
{
rb.velocity = Vector3.zero;
}
if ((!Input.GetKey("a") || !Input.GetKey("s")) && rb.angularVelocity.magnitude > 0.0001)
{
rb.angularVelocity = Vector3.zero;
}
Debug.Log(rb.transform.position.y);
}
}