Пример #1
0
    private void StateAction()
    {
        switch (cState)
        {
        case StateMachine.CombatState.Defend:

            break;

        case StateMachine.CombatState.Attack:
            if (Vector3.Distance(transform.position, targetObject.transform.position) > attackRange)
            {
                if (!AvoidObstacle())
                {
                    RotateObject(targetObject.transform.position);
                }
            }
            else
            {
                if (targetObject == null)
                {
                    cState = StateMachine.CombatState.Idle;
                    mState = StateMachine.MovementState.Wander;
                    break;
                }

                if (targetScript == null)
                {
                    targetScript = targetObject.GetComponent <FSMController>();
                    if (targetScript == null)
                    {
                        targetObject = null;
                        //Debug.LogError("No target script found!");
                        return;
                    }
                }

                //Start attack animation if not running
                targetScript.DealDamage(dps * Time.deltaTime);
            }

            break;

        case StateMachine.CombatState.Death:
            Collider c = GetComponent <BoxCollider>();
            if (c == null)
            {
                GetComponent <SphereCollider>().enabled = false;
            }
            else
            {
                c.enabled = false;
            }

            if (defenceTarget != null)
            {
                defenceTarget.GetComponent <StatueScript>().ReduceDefenderCount();
            }

            isDead = true;
            SpawnController.DestroyObject(gameObject);
            break;

        case StateMachine.CombatState.Capture:

            //TODO: BUG: Still not working
            if (statueScript == null)
            {
                statueScript = targetObject.GetComponent <StatueScript>();
                if (statueScript == null)
                {
                    //Debug.LogError("No target script found!");
                    return;
                }
            }

            if (statueScript.Team == team)
            {
                targetObject = null;
                statueScript = null;
                cState       = StateMachine.CombatState.Idle;
                mState       = StateMachine.MovementState.Wander;
                break;
            }

            if (Vector3.Distance(transform.position, targetObject.transform.position) > 3f)
            {
                RotateObject(targetObject.transform.position);

                //Walk forward with fixed update
            }
            else
            {
                statueScript.DoCapture(team, (int)hpC.MaxHp);
                cState = StateMachine.CombatState.Death;
            }

            break;
        }

        switch (mState)
        {
        case StateMachine.MovementState.Wander:
            //TODO: Check obstacle avoidance, then rotate else wander rotate
            if (!AvoidObstacle())
            {
                if (!wanderActive)
                {
                    break;
                }
                rotateDir = Wander.Direction(rotSpeed, rotateDir, 10);
            }

            break;

        case StateMachine.MovementState.Seek:
            //TODO: Check obstacle avoidance, then rotate or move along path?
            //TODO: Check if enemy is close, then attack or flee
            if (!AvoidObstacle())
            {
                if (defenceTarget != null)
                {
                    RotateObject(defenceTarget.transform.position);
                    break;
                }

                if (targetObject != null)
                {
                    Vector3 disVector = targetObject.transform.position - transform.position;
                    if (HelperFunctions.VectorLength(disVector) < seekRange)
                    {
                        if (cState != StateMachine.CombatState.Capture)
                        {
                            RotateObject(disVector);
                        }
                    }
                }
            }

            break;

        case StateMachine.MovementState.Flee:
            if (!AvoidObstacle())
            {
                Vector3 disVector = (targetObject.transform.position - transform.position);
                if (HelperFunctions.VectorLength(disVector) <= fleeDistance)
                {
                    RotateObject(transform.position - disVector);
                }
            }

            break;

        case StateMachine.MovementState.Interpose:
            if (targetObject == null)
            {
                mState = StateMachine.MovementState.Wander;
                break;
            }

            if (defenceTarget != null)
            {
                Vector3 intercept = ((defenceTarget.transform.position - targetObject.transform.position) / 2) +
                                    targetObject.transform.position;
                RotateObject(intercept);
            }

            break;
        }
    }