Есть ли способ создать кривую при запуске игрового объекта игроку? - PullRequest
0 голосов
/ 06 августа 2020

Это то, что я пробовал до сих пор: я создаю raycast, и если он попадает в объект на уровне 8 (слой, на котором объекты должны быть запущены для игрока), я вызываю функцию SlerpToHand (). *

    private void Update()
    {
        if(Physics.Raycast(transform.position, transform.forward * raycastLength, out hit))
        {
            if(hit.collider.gameObject.layer == 8)
            {
                // Launch object to player
                SlerpToHand(hit.collider.transform);
            }
        }
    }

Внутри SlerpToHand () я установил позицию объекта в Vector3.Slerp (), этот вектор создается из значений в выбранном объекте.

    private void SlerpToHand(Transform hitObj)
    {
        Vector3 hitObjVector = new Vector3(hitObj.transform.position.x, hitObj.transform.position.y, hitObj.transform.position.z);

        hitObj.position = Vector3.Slerp(hitObjVector, transform.position, speed);
    }

Но результат этого все не так, объект просто телепортируется в руки игрока. Разве Vector3.Slerp () - не лучший способ подвести объект к игроку? Для контекста я пытаюсь воссоздать захватывающие перчатки Half-Life: Alyx. Еще предстоит поработать с жестами рук, но я просто пытаюсь уменьшить кривую объекта. Помощь очень приветствуется, дайте мне знать, если потребуется дополнительная информация.

1 Ответ

0 голосов
/ 06 августа 2020

См. Unity docs :

publi c stati c Vector3 Slerp (Vector3 a, Vector3 b, float t);

Здесь t - нормализованное положение между двумя входными значениями. Это означает, что если t = 0, результатом будет ровно первое значение. Если t = 1, результатом будет ровно второе значение. Если t = 0,5, результатом будет среднее между двумя значениями.

Итак, обычно вам нужно вызывать Slerp при каждом обновлении, шаг за шагом увеличивая t от 0 до 1. Для этого обычно используется Time.deltaTime (что равно времени между обновлениями). Для управления скоростью умножьте свою скорость на Time.deltaTime.

Update()
{
    if (t < 1)
    {
        t += Time.deltaTime * speed;
        hitObj.position = Vector3.Slerp(startPosition, endPosition, t);
    }
}

... и в этом случае для начала движения вам просто нужно установить t = 0. Вероятно, вам придется реализовать свою собственную logi c здесь, но это должно показать идею.

Дополнительно:

  • Slerp используется для интерполяции между векторными направлениями, для позиций используется Lerp.
  • Рассмотрите возможность использования плагина DOTween - он бесплатный и мощный для таких случаев.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...