ЕДИНСТВО - управляемый физикой персонаж, не реагирующий на гравитацию при движении вперед - PullRequest
0 голосов
/ 23 апреля 2019

Я делаю простую игру, используя персонажа и физику. Персонаж использует капсульный коллайдер.Мне удалось заставить персонажа двигаться, добавив силы, ограничив их, чтобы они не достигли огромных значений, и добавил противоположные силы, когда не нажимаются никакие клавиши перемещения (было и 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);
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...