Пример #1
0
    protected virtual void Update()
    {
        switch (m_currentState)
        {
        case eUnitState.AwaitingDecision:
        {
            int     targetID = Utilities.INVALID_ID;
            Vector3 targetPosition;
            if (getClosestVisibleTarget(out targetID, out targetPosition))
            {
                switch (m_unit.getUnitType())
                {
                case eUnitType.Attacker:
                    switchToState(eUnitState.SetDestination, targetID, targetPosition);
                    break;

                case eUnitType.Harvester:
                    switchToState(eUnitState.SetDestinationToSafePosition);
                    break;

                default:
                    Assert.IsTrue(false);
                    break;
                }
            }
        }
        break;

        case eUnitState.MovingToNewPosition:
        {
            Vector3 enemyPosition = new Vector3();
            if (m_targetID != Utilities.INVALID_ID && isTargetInVisibleSight(out enemyPosition))
            {
                if (m_tankShooting.isTargetInAttackRange(enemyPosition))
                {
                    switchToState(eUnitState.AttackingEnemy, m_targetID);
                }
            }
            else if (m_targetID != Utilities.INVALID_ID)
            {
                switchToState(eUnitState.AwaitingDecision);
            }
            else
            {
                if (m_tankMovement.reachedDestination())
                {
                    switchToState(eUnitState.AwaitingDecision);
                }
            }
        }
        break;

        case eUnitState.AttackMovingToNewPosition:
        {
            int     targetID = Utilities.INVALID_ID;
            Vector3 targetPosition;
            if (getClosestVisibleTarget(out targetID, out targetPosition))
            {
                switchToState(eUnitState.SetDestination, targetID, targetPosition);
            }
        }
        break;

        case eUnitState.AttackingEnemy:
        {
            Vector3 enemyPosition = new Vector3();
            if (isTargetInVisibleSight(out enemyPosition))
            {
                if (m_tankShooting.isTargetInAttackRange(enemyPosition))
                {
                    m_tankShooting.attackPosition(enemyPosition);
                }
                else
                {
                    switchToState(eUnitState.SetAttackDestination, m_targetID, enemyPosition);
                }
            }
            else
            {
                switchToState(eUnitState.AwaitingDecision);
            }
        }
        break;
        }
    }