Пример #1
0
        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();
            });
        }