- Home /
 
targeting multiple enemys
I am using the OverlapSphere to get enemies for my targeting system.
here is my code
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 using UnityEngine;
 using System.Collections;
 
 public class advancedTargetting : MonoBehaviour {
     
     
         public bool showRing = false;
     private Transform myTransform;
     public float strafeSpeed = 10;
     public GameObject player;
     public bool look;
     Transform selected = null;
     
     public float range;
     // Use this for initialization
     
         public void Awake() {
         
 
         
         
         
         myTransform = transform;
     
         
         animation["CombatStance"].wrapMode = WrapMode.Loop;
         
         
     }
     
     
     void Start () {
       
         
         
     
     }
     
     public Transform FindNearestEnemyInSphere(float radius){ 
     float minDist = Mathf.Infinity;
     Transform nearest = null;
     Collider[] cols = Physics.OverlapSphere(transform.position, 10);
     foreach (Collider hit in cols) {
         if (hit && hit.tag == "Enemy"){
             float dist = Vector3.Distance(transform.position, hit.transform.position);
             if (dist < minDist){
                 minDist = dist;
                 nearest = hit.transform;
                     
         
             }
         }
     }
         
         
     return nearest;
 }
     
     // Update is called once per frame
     
 
     
         private void SortTargetsByDistance() {
         
     }
 
    
      void Update() {
         
         
          if (Input.GetKeyDown("tab")){
         if (selected == null){ // if nothing selected...
             Transform enemy = FindNearestEnemyInSphere(range);
             Transform enemyt = FindNearestEnemyInSphere(7);
             if (enemy){
                 selected = enemy;   
             turnObjectOnandOff a = enemy.GetComponent<turnObjectOnandOff>();
         a.ring.active = true;
                 look = true;
             }
                 
                 
         } else {    
                 
                 showRing = false;
           turnObjectOnandOff a = selected.GetComponent<turnObjectOnandOff>();
         a.ring.active = false;
                     look = false;
             selected = null; // then clear the variable
         }
             
     }
         
         
         
         
 
         
         
     
 
 }
 }
 
               //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
The problem is that it does not sort by distance. it just gets the one closest to you. How would I add sort by distance in this script?
Answer by syclamoth · Nov 08, 2011 at 04:17 AM
There are a couple of things here- you'd need to restructure the way the enemy finder works, since at the moment it can only return a single enemy! You first need to make it return an array or a list (preforably a List, for simplicity's sake), then populate the list in the function.
First up, put 'using System.Collections.Generic' at the top, so that you have generics (which are really useful).
 public IList<Transform> FindEnemiesInSphere(float radius){ 
     Collider[] cols = Physics.OverlapSphere(transform.position, 10);
     SortedList<float, Transform> transforms = new SortedList<float, Transform>();
     foreach (Collider hit in cols) {
         if (hit && hit.tag == "Enemy"){
             float Dist = Vector3.Distance(transform.position, hit.transform.position);
             transforms.Add(dist, hit.transform); 
         }
     }
     return transforms.Values;
 }
 
               This will give you a list of Transforms which you can iterate through with a Foreach, and which will be sorted in order of distance!
how would I do it so that when I hit shift it would... for say make the enemy turn red?
Which enemy? I assume you have several. I'm not specifying any particular way of using this function, by the way- just call it in your script, and then iterate through the members however you like. To make the enemy turn red, you'd have to change some value in its material- I can't really say exactly how, because that differs from renderer to renderer.
Could you give me a code snippet on how to alternate the enemy's?
huh? Now I have absolutely no idea what you're talking about.
Your answer