единство, как я могу преобразовать transform.position в физическое движение? - PullRequest
0 голосов
/ 22 марта 2020

В моем коде я перемещаю игрока с transform.position, но это создает проблемы с коллайдерами и физикой c моей игры.

 transform.position = new Vector3(
                transform.position.x + touch.deltaPosition.x * multiplier,
                transform.position.y,
                transform.position.z + touch.deltaPosition.y * multiplier)

Как я могу преобразовать это в скорость или некоторое физическое движение так что скорость получить не влияет?

1 Ответ

0 голосов
/ 22 марта 2020

В общем, как только возникает Rigidbody и возникают коллизии, вам следует избегать двух вещей:

  • Перемещение вашего объекта с помощью transform
  • Перемещение вашего объекта в Update

И то, и другое нарушает физику.

Что вы скорее всего хотите сделать, так это либо непосредственно обновить Rigidbody.velocity. Это хорошо сделать в Update

// If possible already reference via Inspector
[SerializeField] private Rigidbody _rigidbody;

private void Start()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();
}

private void Update()
{
    ...

    _rigidbody.velocity = Vector3.right * touch.deltaPosition.x * multiplier 
        + Vector3.forward * touch.deltaPosition.y * multiplier;
    ...
}

Альтернативой является отделение пользовательского ввода (Update) от физической процедуры (FixedUpdate) и использование MovePosition

(при условии, что ваш код выполняется в обновлении)

private Vector3 targetPosition;

// If possible already reference via Inspector
[SerializeField] private Rigidbody _rigidbody;

private void Start()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();

    targetPosition = transform.position;
}

private void Update()
{
    ...

    targetPosition = _rigidbody.position 
        + Vector3.right * touch.deltaPosition.x * multiplier 
        + Vector3.forward * touch.deltaPosition.y * multiplier;

    ...
}

private void Update()
{
    _rigidbody.MovePosition(targetPosition);
}
...