Вы запускаете новый Coroutine каждый кадр, так как LateUpdate
запускает каждый кадр после того, как все Update
вызовы завершены!
Вы можете избежать этого с помощью немного другого подхода:
private bool isIntermediate;
private bool moveCamera;
private void LateUpdate ()
{
if(!moveCamera) return;
if(isIntermediate)
{
camera.lerp(intermediatePosition);
}
else
{
camera.lerp(positionToMoveTo);
}
}
private IEnumerator MoveCamera()
{
moveCamera = true;
isIntermediate=true;
yield return new WaitForSeconds(3f);
isIntermediate=false;
// Wait until the camera reaches the target
while(camera.transform.position == PositionToMoveTo){
yield return null;
}
// Stop moving
moveCamera = false;
// just to be sure your camera has exact the correct position in the end
camera.transform.position = PositionToMoveTo;
}
В качестве альтернативы вы можете сделать все движения в сопрограмме без LateUpdate
(но, честно говоря, я не уверен, что сопрограммы сделаны до или после Update
)
private IEnumerator MoveCamera()
{
float timer = 3f;
while(timer>0)
{
timer -= Time.deltaTime;
camera.lerp(intermediatePosition);
yield return null;
}
// Wait until the camera reaches the target
while(camera.transform.position == PositionToMoveTo){
camera.lerp(PositionToMoveTo);
yield return null;
}
// just to be sure your camera has exact the correct position in the end
camera.transform.position = PositionToMoveTo;
}
Этот второй будет чище, как я уже сказал, я не знаю, требуется ли вам запускать его в LateUpdate
Примечание : ==
Оператор Vector3 имеет точность 0.00001
.Если вам нужна более высокая или более низкая точность, вы должны изменить значение на
if(Vector3.Distance(camera.transform.position, PositionToMoveTo) <= YOUR_DESIRED_THRESHOLD)
Теперь все, что вам нужно сделать, - это звонить своему сопрограмму Каждый раз, когда вы хотите изменить положение камеры.
void Update()
{
if (buttonPress == a)
{
// Make sure the Coroutine only is running once
StopCoroutine(MoveCamera);
positionToMoveTo = positions[currentPosition--];
StartCoroutine (MoveCamera);
}
if (buttonpress == b)
{
// Make sure the Coroutine only is running once
StopCoroutine (MoveCamera);
positionToMoveTo = positions[currentPosition++];
StartCoroutine (MoveCamera);
}
}