Unity3D заставляет объект следовать за другим, но двигаться дальше - PullRequest
0 голосов
/ 05 февраля 2020

Итак, вот что у меня есть: 3D-сфера игрового объекта SteamVR для рук.

что я хочу: сфера перемещается в том же направлении / положении, что и стрелка, но перемещается дальше с помощью множителя. Например, я перемещаю контроллер VR, и рука перемещается на 1 единицу. Я хочу, чтобы сфера двигалась в одном направлении за то же время, но, например, за 2 единицы. Как мне это сделать? я попробовал просто

sphere.transform.position = ControllerToFollow.position +2f;

но тогда сфера всегда смещена.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Просто отследите дельту движения руки и умножьте ее на определенный множитель.

В начале манипуляции храните

private Vector3 lastControllerPosition;

...

lastControllerPosition = ControllerToFollow.position;

, затем в каждом кадре сравните

var delta = ControllerToFollow.position - lastHandPosition;
// Don't forget to update lastControllerPosition for the next frame
lastControllerPosition = ControllerToFollow.position;

Теперь в delta у вас есть движение контроллера со времени последнего кадра. Таким образом, вы можете присвоить его сфере с помощью множителя, используя Transform.Translate

sphere.transform.Translate(delta * multiplier, Space.World); 

или просто используя

sphere.transform.position += delta * multiplier;
0 голосов
/ 05 февраля 2020

position - это Vector3, который по существу равен 3 числам с плавающей запятой - вы не можете добавить Vector3 с помощью числа с плавающей запятой, если не перегружаете оператор +. В противном случае вы можете сделать следующее:

Vector3 followPos = new Vector3(ControllerToFollow.position.x + 2f,
                                ControllerToFollow.position.y + 2f, 
                                ControllerToFollow.position.z + 2f);
sphere.transform.position = followPos;

Если вы хотите, чтобы он следовал только по одной оси, вы можете сделать следующее:

Vector3 followPos = new Vector3(ControllerToFollow.position.x + 2f, // Follow on x Axis
                                ControllerToFollow.position.y, // Y axis is the same
                                ControllerToFollow.position.z); // X Axis is the same
sphere.transform.position = followPos;

Редактировать: Я думаю, что я лучше понять вашу проблему. Вот лучшая версия.

if (Vector3.Distance(sphere.transform.position, ControllerToFollow.position) >= 2f)
{
    // Code that makes the sphere follow the controlling
}
...