void StateInvestigate() { if (currentPath != null) { if (currentPath.ReachedEndNode()) { anim.SetBool("move", false); currentPath = null; curTarget = null; states = ai_states.idle; return; } Vector3 nodePos = currentPath.GetNextNode(); if (Vector3.Distance(myTransform.position, nodePos) < 1) { currentPath.currentPathIndex++; } else { myTransform.LookAt(nodePos); myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); } } else { } }
void stateMove() { if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() > 0) { if (Vector3.Distance(myTransform.position, curTarget.transform.position) > maxAttackDst) { //MOVE CLOSER myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); } else if (Vector3.Distance(myTransform.position, curTarget.transform.position) < minAttackDst) { //MOVE AWAY myTransform.Translate(Vector3.forward * -1 * moveSpeed * Time.deltaTime); } else { //ATTACK anim.SetBool("move", false); states = ai_states.combat; } } else { anim.SetBool("move", false); states = ai_states.idle; } }
void stateIdle() { if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() > 0) { myTransform.LookAt(curTarget.transform); if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDst && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDst) { //ATTACK states = ai_states.combat; } else { //MOVE anim.SetBool("move", true); states = ai_states.move; } } else { //FIND TARGET Player[] allPlayers = GameObject.FindObjectsOfType <Player>(); Player bestTarget = null; for (int i = 0; i < allPlayers.Length; i++) { Player curPlayer = allPlayers[i]; if (curPlayer.GetComponent <Team>().getTeamNumber() != myTeam.getTeamNumber() && curPlayer.GetComponent <Vitals>().GetCurrentHealth() > 0) { if (canISeeTarget(curPlayer.transform)) { print("Searching"); if (bestTarget == null) { bestTarget = curPlayer; } else { //CHANGE IF BETTER IS FOUND if (Vector3.Distance(curPlayer.transform.position, myTransform.position) < Vector3.Distance(bestTarget.transform.position, myTransform.position)) { bestTarget = curPlayer; } } } } } if (bestTarget != null) { curTarget = bestTarget; } } }
void stateIdle() { if (curTarget != null && curTarget.GetComponent <Vitals>().getCurHealth() > 0) { if (currentCover != null) { coverManager.ExitCover(currentCover); } currentCover = coverManager.GetCoverTowardsTarget(this, curTarget.transform.position, maxAttackDistance, minAttackDistance, currentCover); if (currentCover != null) { if (Vector3.Distance(myTransform.position, currentCover.transform.position) > 0.2F) { currentPath = CalculatePath(myTransform.position, currentCover.transform.position); anim.SetBool("move", true); state = ai_states.moveToCover; } else { state = ai_states.combat; } } else { if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDistance && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDistance) { //attack state = ai_states.combat; } } } else { //find new target Soldier bestTarget = GetNewTarget(); if (bestTarget != null) { curTarget = bestTarget; } } }
void stateInvestigate() { if (currentPath != null) { Soldier alternativeTarget = GetNewTarget(); if (currentPath.ReachedEndNode() || alternativeTarget != null) { //if we reached the end, we'll start looking for a target anim.SetBool("move", false); currentPath = null; curTarget = alternativeTarget; state = ai_states.idle; return; } Vector3 nodePosition = currentPath.GetNextNode(); if (Vector3.Distance(myTransform.position, nodePosition) < 1) { //if we reached the current node, then we'll begin going towards the next node currentPath.currentPathIndex++; } else { //else we'll move towards current node myTransform.LookAt(nodePosition); myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); } } else { //if we don't have a path, we'll look for a target anim.SetBool("move", false); currentPath = null; curTarget = null; state = ai_states.idle; } }
private void ChangeState(ai_states next_state, EnemyAction action) { next_action = action; ai_state.ChangeState(next_state); is_state_changed = true; }
void stateCombat() { if (curTarget != null && curTarget.GetComponent <Vitals>().getCurHealth() > 0) { //if the target escapes during combat if (!canISeeTheTarget(curTarget)) { Soldier alternativeTarget = GetNewTarget(); if (alternativeTarget == null) { //If I can't see the target anymore, I'll need to Investigate last known position targetLastKnownPosition = curTarget.transform.position; //we'll need to calculate a path towards the target's last known position and we'll do so using the Unity NavMesh combined with some custom code currentPath = CalculatePath(myTransform.position, targetLastKnownPosition); anim.SetBool("move", true); if (currentCover != null) { coverManager.ExitCover(currentCover); } state = ai_states.investigate; } else { curTarget = alternativeTarget; } return; } myTransform.LookAt(curTarget.transform); if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDistance && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDistance) { //attack if (curFireCooldown <= 0) { anim.SetTrigger("fire"); curTarget.GetComponent <Vitals>().getHit(damageDealt); curFireCooldown = fireCooldown; } else { curFireCooldown -= 1 * Time.deltaTime; } } else { if (curCoverChangeCooldown <= 0) { curCoverChangeCooldown = coverChangeCooldown; anim.SetBool("move", false); state = ai_states.idle; } else { curCoverChangeCooldown -= 1 * Time.deltaTime; } } } else { state = ai_states.idle; } }
void stateMoveToCover() { if (curTarget != null && currentCover != null && currentCover.AmICoveredFrom(curTarget.transform.position)) { if (currentPath != null) { Soldier alternativeTarget = GetNewTarget(); if (alternativeTarget != null && alternativeTarget != curTarget) { float distanceToCurTarget = Vector3.Distance(myTransform.position, curTarget.transform.position); float distanceToAlternativeTarget = Vector3.Distance(myTransform.position, alternativeTarget.transform.position); float distanceBetweenTargets = Vector3.Distance(curTarget.transform.position, alternativeTarget.transform.position); if (Mathf.Abs(distanceToAlternativeTarget - distanceToCurTarget) > 5 && distanceBetweenTargets > 5) { curTarget = alternativeTarget; coverManager.ExitCover(currentCover); currentCover = coverManager.GetCoverTowardsTarget(this, curTarget.transform.position, maxAttackDistance, minAttackDistance, currentCover); currentPath = CalculatePath(myTransform.position, currentCover.transform.position); return; } } if (currentPath.ReachedEndNode()) { //if we reached the end, we'll start looking for a target anim.SetBool("move", false); currentPath = null; state = ai_states.combat; return; } Vector3 nodePosition = currentPath.GetNextNode(); if (Vector3.Distance(myTransform.position, nodePosition) < 1) { //if we reached the current node, then we'll begin going towards the next node currentPath.currentPathIndex++; } else { //else we'll move towards current node myTransform.LookAt(nodePosition); myTransform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); } } else { //if we don't have a path, we'll look for a target anim.SetBool("move", false); state = ai_states.idle; } } else { anim.SetBool("move", false); state = ai_states.idle; } }
void stateCombat() { if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() > 0) { if (!canISeeTarget(curTarget.transform)) { targetLastKnownPos = curTarget.transform.position; currentPath = CalcPath(myTransform.position, targetLastKnownPos); anim.SetBool("move", true); states = ai_states.Investigate; return; } myTransform.LookAt(curTarget.transform); if (Vector3.Distance(myTransform.position, curTarget.transform.position) <= maxAttackDst && Vector3.Distance(myTransform.position, curTarget.transform.position) >= minAttackDst) { //ATTACK if (curFireRate <= 0) { anim.SetTrigger("fire"); AudioManager.PlaySound(fire, AudioManager.AudioGroups.GameSFX); float outCome = Random.Range(0, 2); if (outCome == 1) { curTarget.GetComponent <Vitals>().getHit(damage); } curFireRate = fireRate; } else { curFireRate -= 1 * Time.deltaTime; } } else { //MOVE anim.SetBool("move", true); states = ai_states.move; } } else { if (curTarget != null && curTarget.GetComponent <Vitals>().GetCurrentHealth() <= 0) { targetLastKnownPos = curTarget.transform.position; currentPath = CalcPath(myTransform.position, targetLastKnownPos); anim.SetBool("move", true); states = ai_states.Investigate; } else { states = ai_states.idle; } } }