private IEnumerator MoveToPosition(Vector3 position) { // NOTE (darren): why do we need to wait a frame? // if we generate a position that is too close + we are already // there, then we can actually set coroutine_ to the DoAfterDelay // which will get overridden by the first coroutine_ when the method returns... // therefore we lose the reference to the DoAfterDelay :O yield return(null); Vector2 xzPosition = position.Vector2XZValue(); while (true) { Vector2 currentXZPosition = stateMachine_.Player.transform.position.Vector2XZValue(); if (Vector2.Distance(currentXZPosition, xzPosition) <= kGoodEnoughDistance) { break; } stateMachine_.InputState.LerpMovementVectorTowards(xzPosition - currentXZPosition); yield return(null); } coroutine_ = CoroutineWrapper.DoEveryFrameForDelay(UnityEngine.Random.Range(kIdleDelayMin, kIdleDelayMax), () => { stateMachine_.InputState.LerpMovementVectorTowards(Vector2.zero); }, () => { MoveToRandomNearbyPosition(); }); }