GlideAround()
является IEnumerator
и не может быть вызван как метод.Вы должны запустить его, используя StartCoroutine
StartCoroutine(GlideAround());
Также обратите внимание, что speed * Time.deltaTime
не имеет смысла для использования в Lerp
.В вашем случае обычно требуется постоянное значение от 0 до 1 (поскольку вы повторно используете текущую позицию в качестве первого параметра).
Например, значение 0,5 означает: каждый кадр устанавливает новую позицию в центрмежду текущей и целевой позициями.
Так как вы ловите его с помощью предельного значения 0.05f
, это должно быть хорошо, но в целом я бы не стал использовать Lerp
как этот ... с очень маленькими значениями, которые выможет никогда не достичь целевой позиции.
Поэтому я предпочел бы либо контролировать постоянную скорость и использовать
bool isHeadingA = true;
while(true)
{
// if it was intended you can ofourse also again use
// Vector2.Distance(transform.position, isHeadingA ? pointA.position : pointB.position) <= 0.05f)
while (transform.position != (isHeadingA ? pointA.position : pointB.position))
{
yield return new WaitForEndOfFrame();
transform.position = Vector2.MoveTowards(transform.position, isHeadingA ? pointA.position : pointB.position, speed * Time.deltaTime);
}
// flip the direction
isHeadingA = !isHeadingA;
}
!=
с точностью0.00001
, и здесь все в порядке, поскольку MoveTowards
избегает перерегулирования, поэтому в определенный момент он обязательно достигнет позиции, если speed != 0
.
Или, альтернативно, вы можете использовать Lerpесли вы хотите контролировать продолжительность движения с сглаженной скоростью входа и выхода , используя, например, Mathf.PingPong
в качестве фактора и Mathf.SmoothStep
для облегчения входа и выхода, как
while(true)
{
yield return new WaitForEndOfFrame();
// linear pingpong between 0 and 1
var factor = Mathf.PingPong(Time.time, 1);
// add easing at the ends
factor = Mathf.SmoothStep(0, 1, factor);
// optionally add even more easing ;)
//factor = Mathf.SmoothStep(0, 1, factor);
transform.position = Vector2.Lerp(pointA.position, pointB.position, factor);
}