Esempio n. 1
0
    // Use this for initialization
    void Start()
    {
        m_Animator = GetComponent<Animator> ();
        m_NavMeshAgent = GetComponent<NavMeshAgent> ();
        m_AudioSource = GetComponent<AudioSource> ();

        UpdateTarget ();

        m_CurState = AIState.AIStateNone;

        AIActionState AIAS = new AIActionState ();
        AIAS.state = AIState.AIStateIdle;
        AIAS.duration = 1.0f;
        AIAS.targetPosition = m_Target.transform.position;
        m_CurActionState = AIAS;

        //NotificationCenter.DefaultCenter ().AddObserver (transform, "OnEnemyHitAction");
        //NotificationCenter.DefaultCenter ().AddObserver (RightHandCollider, "OnAIFistAction");
    }
Esempio n. 2
0
    void GenerateAIActionState()
    {
        float distance = Vector3.Distance (transform.position, m_Target.transform.position);

        //Debug.Log (distance);

        AIActionState AIAS = new AIActionState ();

        switch (m_CurState)
        {
        case AIState.AIStateIdle:
        case AIState.AIStateMove:
            if (distance > m_SaveDistance)
            {
                AIAS.state = RandomAIState (AIState.AIStateIdle, AIState.AIStateMove, AIState.AIStateMove, AIState.AIStateMove);
                if (AIState.AIStateIdle == AIAS.state) AIAS.duration = m_IdleDuration;
                else AIAS.duration = m_MoveDuration;
                AIAS.targetPosition = m_Target.transform.position;
            } else if (distance > m_AlertDistance)
            {
                AIAS.state = RandomAIState (AIState.AIStateIdle, AIState.AIStateMove, AIState.AIStateMove);
                if (AIState.AIStateIdle == AIAS.state) AIAS.duration = m_IdleDuration;
                else if (AIState.AIStateMove == AIAS.state) AIAS.duration = m_MoveDuration;
                else if (AIState.AIStateAttack == AIAS.state) AIAS.duration = 0.66f;
                else {}

                //2 possible, toward player or another direction

                AIAS.targetPosition = RandomTargetPosition (transform.position, m_Target.transform.position);
            } else if (distance > m_SeperateDistance)
            {
                AIAS.state = RandomAIState (AIState.AIStateAttack, AIState.AIStateAttack, AIState.AIStateAttack, AIState.AIStateMove);
                if (AIState.AIStateMove == AIAS.state) AIAS.duration = m_MoveDuration;
                else if (AIState.AIStateAttack == AIAS.state) AIAS.duration = 0.66f;
                else {}
            } else
            {
                AIAS.state = AIState.AIStateAttack;
                AIAS.duration = m_AttackDuration;
                //AIAS.targetPosition = LeaveTargetPosition (transform.position, m_Target.transform.position);
            }

            break;
        case AIState.AIStateAttack:
        case AIState.AIStateHit:
            //easy mode, leave first
            AIAS.state = AIState.AIStateMove;
            AIAS.duration = m_MoveDuration;
            AIAS.targetPosition = LeaveTargetPosition (transform.position, m_Target.transform.position);
            break;
        case AIState.AIStateNone:
            AIAS.state = AIState.AIStateIdle;
            AIAS.duration = m_IdleDuration;
            AIAS.targetPosition = m_Target.transform.position;
            break;
        default:
            break;
        }

        m_AIActionQueue.Enqueue (AIAS);
    }
Esempio n. 3
0
    void RunActionQueue()
    {
        if (m_CurActionState == null) return;

        if (m_Count < 0)
        {
            if (m_AIActionQueue.Count < 1)
            {
                GenerateAIActionState ();
                return;
            }

            m_CurActionState = m_AIActionQueue.Dequeue ();
            GenerateAIActionState ();

            m_CurState = m_CurActionState.state;
            m_Count = m_CurActionState.duration;
        }

        //Debug.Log (m_CurState);

        switch (m_CurState)
        {
        case AIState.AIStateIdle:
            m_NavMeshAgent.ResetPath ();

            m_Animator.speed = 1.0f;
            //AnimatorControllerManager.SetStateIdle (m_Animator);

            m_Count -= Time.deltaTime;
            break;
        case AIState.AIStateMove:
            m_Animator.speed = 1.0f;
            //AnimatorControllerManager.SetStateWalk (m_Animator);

            if (m_Count == m_CurActionState.duration)
            {
                m_NavMeshAgent.SetDestination (m_CurActionState.targetPosition);
            }

            m_Count -= Time.deltaTime;
            break;
        case AIState.AIStateAttack:
            if (m_Count == m_CurActionState.duration)
            {
                m_AudioSource.PlayOneShot (AudioClipAttack);

                //NotificationCenter.DefaultCenter ().PostNotification (RightHandCollider, "OnAIFistAction", gameObject);
            }
            // turn around first
            m_NavMeshAgent.ResetPath ();

            Vector3 dir = m_Target.transform.position - transform.position;
            transform.forward = dir;

            m_Animator.speed = 2.0f;
            //AnimatorControllerManager.SetStateAttack (m_Animator);

            m_Count -= Time.deltaTime;
            break;
        case AIState.AIStateHit:

            m_NavMeshAgent.ResetPath ();

            transform.position -= transform.forward.normalized * 0.02f;

            m_Count -= Time.deltaTime;
            break;
        case AIState.AIStateNone:

            m_NavMeshAgent.ResetPath ();

            m_Count -= Time.deltaTime;
            break;
        default:
            break;
        }
    }