Может ли кто-нибудь помочь, мой игрок (который является кубом в трехмерной среде), он телепортируется в 0,0, и я вообще не могу его переместить - PullRequest
0 голосов
/ 25 марта 2020

(я думаю, что это в функции обновления кода)

public class PlayerMovement : MonoBehaviour
{
    public float speed = 18;
    private Rigidbody rig;
    // Start is called before the first frame update
    void Start()
    {
        rig = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        float hAxis = Input.GetAxis("Horizontal");
        float vAxis = Input.GetAxis("Vertical");
        Vector3 Movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;
        rig.MovePosition(transform.position = Movement);
    }
}

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Код, который вы используете, равен

void Update()
{
    float hAxis = Input.GetAxis("Horizontal");
    float vAxis = Input.GetAxis("Vertical");
    Vector3 Movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;

    transform.position = Movement;

    rig.MovePosition(transform.position);
}

Теперь вы видите, в чем проблема?

  • ваш Movement будет каждый кадр очень маленьким, поскольку оно умножается на Time.deltaTime (для 60 F / s это примерно равно 1/60 = 0.017) - еще не является частью проблемы;)

  • Затем вы устанавливаете Ваш объект фиксируется в этой позиции через transform.position. Это всегда будет довольно близко к 0,0,0 с диапазоном около 1/60 * 18 = 0.3.

  • И, наконец, вы говорите Rigidbody, чтобы он двигался точно в ту же позицию, в которой находится ваш объект. сейчас уже в любом случае.


Rigidbody.MovePosition ожидает абсолютную позицию в мире, поэтому вы скорее всего хотите использовать

rig.MovePosition(rig.position + Movement);

Затем обратите внимание, что любое движение, связанное с физикой, должно быть выполнено в FixedUpdate, поэтому ваш код должен выглядеть примерно так:

public class PlayerMovement : MonoBehaviour
{
    public float speed = 18;

    // You could/should reference this directly via the Inspector
    [SerializeField] private Rigidbody rig;

    private Vector3 _movement;

    private void Awake()
    {
        if(!rig) rig = GetComponent<Rigidbody>();
    }

    // Get User input in Update
    private void Update()
    {
        float hAxis = Input.GetAxis("Horizontal");
        float vAxis = Input.GetAxis("Vertical");

        _movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;
    }

    // But apply Physics in FixedUpdate
    private void FixedUpdate()
    {
        rig.MovePosition(rig.position + _movement);
    }
}

Обратите внимание, что в качестве альтернативы, не разделяя оба Вы также можете напрямую назначить Rigidbody.velocity вместо:

public class PlayerMovement : MonoBehaviour
{
    public float speed = 18;

    // You could/should reference this directly via the Inspector
    [SerializeField] private Rigidbody rig;

    private void Awake()
    {
        if(!rig) rig = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        float hAxis = Input.GetAxis("Horizontal");
        float vAxis = Input.GetAxis("Vertical");

        var movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;

        rig.velocity = movement;
    }
}
0 голосов
/ 25 марта 2020

Если я правильно понимаю, объект перемещается в пределах погрешности по отношению к нулю, но после того, как горизонталь и вертикаль становятся равными (0, 0), тогда местоположение становится равным нулевой координате.

Прочитайте эту страницу, я думаю, что вы можете найти ответ на свой вопрос в ней. Rigidbody.MovePosition

Возможное решение:

    // Update is called once per frame
    void Update()
    {
        float hAxis = Input.GetAxis("Horizontal");
        float vAxis = Input.GetAxis("Vertical");
        Vector3 Movement = new Vector3(hAxis, 0, vAxis) * speed * Time.deltaTime;
        //Replacing '=' with '+' or '-' should help
        rig.MovePosition(transform.position + Movement);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...