Проблема при перемещении объекта в определенную позицию Unity 3D - PullRequest
0 голосов
/ 12 января 2019

У меня есть объект, который я хочу медленно и плавно перемещать в определенную позицию при нажатии, поэтому я использовал этот код:

currpos = transform.position;
Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
Rigidbody.MovePosition(Vector3.Lerp(transform.position, NewPos, Time.deltaTime* MoveSpeed)) ;

У меня проблема в том, что когда MoveSpeed ​​находится на низком уровне, объект немного перемещается и не достигает определенной позиции, а при увеличении MoveSpeed ​​он достигает определенной позиции, но быстро! у вас есть предложения?

Ответы [ 4 ]

0 голосов
/ 18 января 2019

Вместо того чтобы прыгать, почему бы просто не двигаться к нему?

currpos = transform.position;
Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
var position = Vector3.MoveTowards(transform.position, NewPos, Time.deltaTime* MoveSpeed);
Rigidbody.MovePosition(position);
0 голосов
/ 13 января 2019

В соответствии с документацией Unity3D на Rigidbody.MovePosition необходимо включить интерполяцию Rigidbody для плавного перехода между двумя позициями. Это также должно быть сделано в FixedUpdate следующим образом:

void FixedUpdate()
{
    rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
}

Rigidbody.MovePosition принимает только один параметр, который является целевым вектором 3. Вы должны просто указать пункт назначения без Lerping, поэтому попробуйте это вместо:

Rigidbody.MovePosition(NewPos + Time.deltaTime * MoveSpeed);

И сделайте это в FixedUpdate. Кроме того:

Если для твердого тела задано значение isKinematic, то оно работает по-другому. Он работает как transform.position = newPosition и телепортирует объект (а не плавный переход).

0 голосов
/ 13 января 2019

Функция Lerp дает точку между 2 векторами каждый раз, когда вы ее называете, так что, как и проблема с черепахой, она никогда не достигнет цели. Это будет становиться все медленнее и медленнее с каждым разом.

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

Также вы можете устранить это поведение, остановив объект после того, как он подойдет слишком близко к объекту (так я обычно его использую)

Также обратите внимание, что если вы хотите анимировать что-то с помощью кода и хотите, чтобы оно было плавным, вы должны рассчитать его с помощью функции «Обновление».

Так что код может быть что-то вроде

void GoToTarget(){
    var currpos = transform.position;
    NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
    traveling = true;
}

void Update () {
    if (traveling){
        rigidbody.MovePosition(Vector3.Lerp(transform.position, NewPos, Time.deltaTime* MoveSpeed));
        if((transform.position-NewPos).magnitude < 0.1f){
            //Current position is too close to Target, teleport to target and stop
            transform.position = NewPos;
            traveling = false;
        }
    }
}

0 голосов
/ 12 января 2019

публичный статический Vector3 Lerp (Vector3 a, Vector3 b, float t);

Интерполирует между векторами a и b по интерполанту t. параметр t ограничен диапазоном [0, 1]. Это чаще всего используется найти точку в некоторой доле пути вдоль линии между двумя конечные точки.

Как говорит Док, это некоторая доля вместо расстояния. Логика неверна.

Таким образом, код может быть изменен следующим образом:

 currpos = transform.position;
 Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
 Vector3 Dir= (NewPos-transform.position).normalized;
 Vector3 velocity= Dir*MoveSpeed;
 Rigidbody.MovePosition(transform.position+velocity);

Если вы настаиваете на использовании Lerp:

   currpos = transform.position;
   Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
   float dist= (NewPos-transform.position).magnitude;
   if(dist!=0)
   {
        Rigidbody.MovePosition(Vector3.Lerp(transform.position, NewPos, Time.deltaTime* MoveSpeed)) ;   
   }
   else
   {
           //do nothing new postion arrived
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...