//private void UpdateState_Patrol() {
    //    if (_lastState != _state) {
    //        // Init Patrol
    //        _patrolPointIndex = FindNearestPatrolPointIndex();
    //        _lastState = _state;
    //    }

    //    float toPoint = MoveTowards(patrolPoints.points[_patrolPointIndex].position);
    //    if (Mathf.Abs(toPoint) <= behaviourSettings.patrolPointDistance) {
    //        _patrolPointIndex++;
    //        if (_patrolPointIndex >= patrolPoints.points.Count) {
    //            _patrolPointIndex = 0;
    //        }
    //    }

    //    if (_isSuspicious) {
    //        state = EnemyState.INVESTIGATE;
    //    }
    //}

    //private void UpdateState_Investigate(float deltaTime) {
    //    if (_lastState != _state) {
    //        // Init investigate
    //        _investigateWaitTimer = behaviourSettings.maxInvestigateWaitTime;
    //        _lastState = _state;
    //    }

    //    float xDiff = DistanceXTo(_investigationPointWorld);
    //    if (Mathf.Abs(xDiff) > behaviourSettings.investigateDistance) {
    //        MoveTowards(xDiff);
    //    } else {
    //        _investigateWaitTimer -= deltaTime;
    //    }

    //    if (_canSeePlayer) {
    //        state = EnemyState.CHASE;
    //    } else if (_isSuspicious) {
    //        _investigateWaitTimer = 0f;
    //    } else if (_investigateWaitTimer <= 0f) {
    //        state = EnemyState.PATROL;
    //    }
    //}

    //private void UpdateState_Chase(float deltaTime) {
    //    if (_lastState != _state) {
    //        // Init chase
    //        _chaseWaitTimer = behaviourSettings.maxChaseWaitTime;
    //        _lastState = _state;
    //    }

    //    if (_canSeePlayer) {
    //        _chaseWaitTimer = behaviourSettings.maxChaseWaitTime;
    //        float xDiff = DistanceXTo(_investigationPoint);
    //        if (Mathf.Abs(xDiff) > behaviourSettings.investigateDistance) {
    //            MoveTowards(xDiff);
    //        } else {
    //            // kill
    //        }
    //    } else {
    //        float xDiff = DistanceXTo(_investigationPoint);
    //        if (Mathf.Abs(xDiff) > behaviourSettings.investigateDistance) {
    //            MoveTowards(xDiff);
    //        } else {
    //            if (_chaseWaitTimer > 0f) {
    //                _chaseWaitTimer -= deltaTime;
    //                if (_chaseWaitTimer <= 0f) {
    //                    state = EnemyState.PATROL;
    //                }
    //            }
    //        }
    //    }
    //}

    private void SetInvestigatePoint(Vector2 point)
    {
        //_investigationPointLevel = navController.GetLevelIndexFromWorldY(point.y);
        //_investigationPointX = point.x;
        //_investigationPointWorld = navController.GetWorldPosition(_investigationPointLevel, _investigationPointX);

        SimpleNav2DPoint origin = navController.GetNavPoint(transform.position);
        SimpleNav2DPoint target = navController.GetNavPoint(point);

        _navSteps = navController.GetNavSteps(origin, target);
    }
    public Stack <SimpleNav2DStep> GetNavSteps(SimpleNav2DPoint origin, SimpleNav2DPoint target)
    {
        // Create a set of steps to get from origin to target
        List <SimpleNav2DStep> steps = new List <SimpleNav2DStep>();

        int   stepLevel = origin.levelIndex;
        float xPosition = origin.xPosition;

        while (stepLevel != target.levelIndex)
        {
            if (stepLevel > target.levelIndex)
            {
                // find stairs down
                int    stairsDownIndex = GetNearestStairsIndexOnLevelByTop(stepLevel, xPosition);
                Stairs stairsDown      = stairs[stairsDownIndex];

                // add step to move to stairs top
                steps.Add(new SimpleNav2DStep {
                    targetXPosition = stairsDown.topPoint.position.x
                });

                // add step to move down stairs
                steps.Add(new SimpleNav2DStep {
                    climbDownStairs = true, targetStairs = stairsDown
                });

                stepLevel--;
            }
            else
            {
                // find stairs up
                int    stairsUpIndex = GetNearestStairsIndexOnLevelByBottom(stepLevel, xPosition);
                Stairs stairsUp      = stairs[stairsUpIndex];

                // add step to move to stairs bottom
                steps.Add(new SimpleNav2DStep {
                    targetXPosition = stairsUp.bottomPoint.position.x
                });

                // add step to move up stairs
                steps.Add(new SimpleNav2DStep {
                    climbUpStairs = true, targetStairs = stairsUp
                });

                stepLevel++;
            }
        }

        steps.Add(new SimpleNav2DStep {
            targetXPosition = target.xPosition
        });
        steps.Reverse();
        return(new Stack <SimpleNav2DStep>(steps));
    }
 public void SetNavTarget(Vector2 point)
 {
     lastOriginPoint = navController.GetNavPoint(transform.position);
     lastNavPoint    = navController.GetNavPoint(point);
     navSteps        = navController.GetNavSteps(lastOriginPoint, lastNavPoint);
 }