//If a target is noticed, it is prioritized void NoticeATarget(TacticalAI.Target newTarget) { int IDToAdd = newTarget.uniqueIdentifier; //Make sure we haven't seen this target already for (int i = 0; i < targetIDs.Count; i++) { if (targetIDs[i] == IDToAdd) { return; } } lastKnownTargetPositions.Add(newTarget.transform.position); listOfCurrentlyNoticedTargets.Add(newTarget); targetIDs.Add(IDToAdd); ChooseTarget(); //If we aren't already engaging in combat, start engaging. if (!engaging) { myAIBaseScript.StartEngage(); engaging = true; } }
void ChooseTarget() { if (eyeTransform) { float currentEnemyScore = 0; float enemyScoreCheckingNow = 0; Transform enemyTransformCheckingNow = eyeTransform; currentEnemyTarget = null; bool foundTargetWithLoS = false; int i = 0; CheckIfWeStillHaveAwareness(); for (i = 0; i < listOfCurrentlyNoticedTargets.Count; i++) { if (listOfCurrentlyNoticedTargets[i].transform) { enemyTransformCheckingNow = listOfCurrentlyNoticedTargets[i].transform; //Only add points if we have LoS if (!Physics.Linecast(eyeTransform.position, enemyTransformCheckingNow.position, layerMask)) { //Get initial score based on distance enemyScoreCheckingNow = Vector3.SqrMagnitude(enemyTransformCheckingNow.position - targetObjectTransform.position); //enemyScoreCheckingNow = Vector3.Distance(enemyTransformCheckingNow.position, targetObjectTransform.position); //Divide by priority enemyScoreCheckingNow = enemyScoreCheckingNow / (listOfCurrentlyNoticedTargets[i].targetScript.GetComponent <TacticalAI.TargetScript>().targetPriority); //See if this score is low enough to warrent changing target if (enemyScoreCheckingNow < currentEnemyScore || currentEnemyScore == 0 || !foundTargetWithLoS) { currentEnemyTarget = listOfCurrentlyNoticedTargets[i]; currentEnemyScore = enemyScoreCheckingNow; foundTargetWithLoS = true; } } //Settle for targets we can't see, if we have to. else if (!foundTargetWithLoS) { enemyScoreCheckingNow = Vector3.SqrMagnitude(enemyTransformCheckingNow.position - targetObjectTransform.position); if (enemyScoreCheckingNow < currentEnemyScore || currentEnemyScore < 0 || !foundTargetWithLoS) { currentEnemyTarget = listOfCurrentlyNoticedTargets[i]; currentEnemyScore = enemyScoreCheckingNow; } } } } if (currentEnemyTarget != null) { AlertAlliesOfEnemy_Shout(); } //If all of the above fails, pick a random target- even if it's one we haven't seen if (currentEnemyTarget == null && enemyTargets.Length > 0) { currentEnemyTarget = enemyTargets[Random.Range(0, enemyTargets.Length - 1)]; } if (currentEnemyTarget != null) { myAIBaseScript.SetMyTarget(currentEnemyTarget.transform, currentEnemyTarget.targetScript.myLOSTarget); } if (currentEnemyTarget == null) { myAIBaseScript.RemoveMyTarget(); } } }