// 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"); }
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); }
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; } }