Я следовал руководству по созданию элементов управления для fps-игры на единство.элементы управления работают, но если я оставляю элементы управления, то продолжаю двигаться влево - PullRequest
0 голосов
/ 09 июня 2019

введите описание изображения здесь Я сделал элементы управления для моего персонажа, чтобы он двигался вдоль оси X. Кажется, они работают нормально, но мой персонаж продолжает двигаться влево, и я не уверен, почему или что я пропустил. Я разместил код из двух отдельных сценариев

Я несколько раз перепроверил его код. Я проверил, не заклинивают ли мои клавиши со стрелками, клавиши numpad и WASD.

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class PlayerMotor : MonoBehaviour
{
    private Vector3 velocity = Vector3.zero;

    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    //gets a movement vector
    public void Move (Vector3 _velocity)
    {
        velocity = _velocity;
    }

    //run every physics iteration
    void FixedUpdate()
    {
        PerformMovement();
    }

    //perform movement based on velocity variable
    void PerformMovement ()
    {
        if (velocity != Vector3.zero)
        {
            rb.MovePosition(rb.position + velocity * Time.fixedDeltaTime);
        }

    }

}

И контроллер:

using UnityEngine;

[RequireComponent(typeof(PlayerMotor))]
public class PlayerController : MonoBehaviour
{
    [SerializeField]                //makes speed show up in inspector even if set to private
    private float speed = 5f;


    private PlayerMotor motor;
    void Start ()
    {
        motor = GetComponent<PlayerMotor>();
    }

    void Update()
    {
        //Calculate movement velocity as a 3D vector
        float _xMov = Input.GetAxisRaw("Horizontal");
        float _zMov = Input.GetAxisRaw("Vertical");

        Vector3 _movHorizontal = transform.right * _xMov;
        Vector3 _movVertical = transform.forward * _zMov;


        //final movement vector
        Vector3 _velocity = (_movHorizontal + _movVertical).normalized * speed;

        //apply movement
        motor.Move(_velocity);

    }
}

Я ожидаю 0, когда не нажимаю кнопки, но кажется, что я двигаюсь влево со скоростью 5

1 Ответ

0 голосов
/ 09 июня 2019

Вы подключили контроллер и сообщаете о небольшом движении в одном направлении. Используйте Input.GetAxis вместо Input.GetAxisRaw, чтобы позволить Unity обрабатывать обнаружение мертвой зоны. Таким образом, почти нейтральные входы будут рассматриваться как нейтральные входы.

void Update()
{
    //Calculate movement velocity as a 3D vector
    float _xMov = Input.GetAxis("Horizontal");
    float _zMov = Input.GetAxis("Vertical");

    Vector3 _movHorizontal = transform.right * _xMov;
    Vector3 _movVertical = transform.forward * _zMov;


    //final movement vector
    Vector3 _velocity = (_movHorizontal + _movVertical).normalized * speed;

    //apply movement
    motor.Move(_velocity);

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