- Home /
 
How to make an AI attack a game object with a tag
So I have a fps going and was wondering how to make to teams of robots attack each other. I have tried a lot of things and nothing seems to work. I want him to check to see if there are any "Enemy's" and then chose a random one it can see. I somewhat new to coding and I don't have a lot of experience. My current scripts is this:
 var speed = 3.0;
 var rotationSpeed = 5.0;
 var shootRange = 15.0;
 var attackRange = 30.0;
 var shootAngle = 4.0;
 var dontComeCloserRange = 5.0;
 var delayShootTime = 0.35;
 var pickNextWaypointDistance = 2.0;
 var target : Transform;
 
 private var lastShot = -10.0;
 
 // Make sure there is always a character controller
 @script RequireComponent (CharacterController)
 
 function Start () {
     // Auto setup player as target through tags
     if (target == null && GameObject.FindWithTag("Enemy"))
         target = GameObject.FindWithTag("Enemy").transform;
 
     Patrol();
 }
 
 function Patrol () {
     var curWayPoint = AutoWayPoint.FindClosest(transform.position);
     while (true) {
         var waypointPosition = curWayPoint.transform.position;
         // Are we close to a waypoint? -> pick the next one!
         if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
             curWayPoint = PickNextWaypoint (curWayPoint);
 
         // Attack the player and wait until
         // - player is killed
         // - player is out of sight        
         if (CanSeeTarget ())
             yield StartCoroutine("AttackPlayer");
         
         // Move towards our target
         MoveTowards(waypointPosition);
         
         yield;
     }
 }
 
 
 function CanSeeTarget () : boolean {
     if (Vector3.Distance(transform.position, target.position) > attackRange)
         return false;
     //else
        //    return true;
 
         
                 
     var hit : RaycastHit;
     if (Physics.Linecast (transform.position, target.position, hit))
         return hit.transform == target;
 
     return false;
     
 }    
 
 
 function Shoot () {
     // Start shoot animation
     animation.CrossFade("shoot", 0.3);
 
     // Wait until half the animation has played
     yield WaitForSeconds(delayShootTime);
     
     // Fire gun
     BroadcastMessage("Fire");
     
     // Wait for the rest of the animation to finish
     yield WaitForSeconds(animation["shoot"].length - delayShootTime);
 }
 
 function AttackPlayer () {
     var lastVisiblePlayerPosition = target.position;
     while (true) {
         if (CanSeeTarget ()) {
             // Target is dead - stop hunting
             if (target == null)
                 return;
 
             // Target is too far away - give up    
             var distance = Vector3.Distance(transform.position, target.position);
             if (distance > shootRange * 3)
                 return;
             
             lastVisiblePlayerPosition = target.position;
             if (distance > dontComeCloserRange)
                 MoveTowards (lastVisiblePlayerPosition);
             else
                 RotateTowards(lastVisiblePlayerPosition);
 
             var forward = transform.TransformDirection(Vector3.forward);
             var targetDirection = lastVisiblePlayerPosition - transform.position;
             targetDirection.y = 0;
 
             var angle = Vector3.Angle(targetDirection, forward);
 
             // Start shooting if close and play is in sight
             if (distance < shootRange && angle < shootAngle)
                 yield StartCoroutine("Shoot");
         } else {
             yield StartCoroutine("SearchPlayer", lastVisiblePlayerPosition);
             // Player not visible anymore - stop attacking
             if (!CanSeeTarget ())
                 return;
         }
 
         yield;
     }
 }
 
 function SearchPlayer (position : Vector3) {
     // Run towards the player but after 3 seconds timeout and go back to Patroling
     var timeout = 3.0;
     while (timeout > 0.0) {
         MoveTowards(position);
 
         // We found the player
         if (CanSeeTarget ())
             return;
 
         timeout -= Time.deltaTime;
         yield;
     }
 }
 
 function RotateTowards (position : Vector3) {
     SendMessage("SetSpeed", 0.0);
     
     var direction = position - transform.position;
     direction.y = 0;
     if (direction.magnitude < 0.1)
         return;
     
     // Rotate towards the target
     transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
     transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
 }
 
 function MoveTowards (position : Vector3) {
     var direction = position - transform.position;
     direction.y = 0;
     if (direction.magnitude < 0.5) {
         SendMessage("SetSpeed", 0.0);
         return;
     }
     
     // Rotate towards the target
     transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
     transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
 
     // Modify speed so we slow down when we are not facing the target
     var forward = transform.TransformDirection(Vector3.forward);
     var speedModifier = Vector3.Dot(forward, direction.normalized);
     speedModifier = Mathf.Clamp01(speedModifier);
 
     // Move the character
     direction = forward * speed * speedModifier;
     GetComponent (CharacterController).SimpleMove(direction);
     
     SendMessage("SetSpeed", speed * speedModifier, SendMessageOptions.DontRequireReceiver);
 }
 
 function PickNextWaypoint (currentWaypoint : AutoWayPoint) {
     // We want to find the waypoint where the character has to turn the least
 
     // The direction in which we are walking
     var forward = transform.TransformDirection(Vector3.forward);
 
     // The closer two vectors, the larger the dot product will be.
     var best = currentWaypoint;
     var bestDot = -10.0;
     for (var cur : AutoWayPoint in currentWaypoint.connected) {
         var direction = Vector3.Normalize(cur.transform.position - transform.position);
         var dot = Vector3.Dot(direction, forward);
         if (dot > bestDot && cur != currentWaypoint) {
             bestDot = dot;
             best = cur;
         }
     }
     
     return best;
 }
 
               Any help would be appreciated.
Answer by pvpoodle · Aug 03, 2013 at 02:03 AM
you will need to store a list of all targets rather than a single target initially.
therefore you need to declare your "target" variable as a list. and another transform variable for your selected target.
I have written some quick code for you that you may be able to use.
     void Start() {
     
     List<transform> targets;
     targets = new list<transform>();
     
     Transform selectedtarget;
     selectedtarget = null;
     
     
     GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy");    // find all enemies
     
     foreach(GameObject enemy in go)
         targets.Add(enemy.transform);    // add all enemies
     
     int num = targets.count();     // count number of enemies
     
     System.Random rnd = new System.Random();
     int ran = rnd.Next(0,num);         // generate a random number
     
     
     selectedtarget = targets[ran];  // adds random enemy as selected target.
 
 // attack selected target
 
  }
 
 
 
              hi, im pretty much a c and dot.net guy and the following code will probably have a few errors. I have translated the code into javascript to the best of my abilities.
 function Start () {
 
 var targets : Transform[] = new Transform[];
 var selectedtarget : Transform;
 selectedtarget = null;
 
 var go : GameObject[] = new GameObject[];
 
 go = GameObject.FindGameObjectsWithTag("Enemy");
 
 var length = go.Length;
 
 for (var i = 0; i < length; i++) {
 
     if(go[i].tag=="Enemy") 
         targets.SetValue(go[i].transform);
 
 
 }
 
 var num = targets.Length;
 
 var rnd : System.Random = new System.Random;
 var ran = rnd.Next(0,num);
 
 
 selectedtarget = targets[ran];
 
 
 
 
 }
 
                  please upvote if you find the answer usefull.
Your answer
 
             Follow this Question
Related Questions
Enemy Patrol 1 Answer
Simple AI Error 8025 Parrsing error. 2 Answers
My Eneny AI Script Wont Work? 2 Answers
Enemy not rotating when inside range 1 Answer