- Home /
Question by
D0CT0RGRAY · Apr 25, 2012 at 06:59 AM ·
gameobjectarraysortnumerical
Sorting through an array of gameobjects
Hey everyone, So let me start out by saying what my goal is for this script. What I want to be able to do is:
1. Look for objects tagged as an 'Enemy'
2. Find the closest object tagged as an 'Enemy'
3. Draw a GUI Texture ontop of it when the player presses Tab
4. Draw the same GUI Texture on the 2nd closest object if Tab is pressed again
5. Draw the same GUI Texture on the 3rd and so on...
I have steps 1 - 3 working, but I can't seem to be able to sort the game objects correctly. Here's an example of my code
// the current target
private var target : Transform;
var nearestObj : Transform = null;
function Update() {
if (Input.GetKeyDown("tab")) {
target = GetNearestTaggedObject();
nearestObj.GetComponent("TargetSelectingIcon").DrawSelect();
}
if (Input.GetKeyDown("return")){
target = GetNearestTaggedObject();
nearestObj.GetComponent("TargetSelectingIcon").DrawLock();
}
if (Input.GetKeyDown("escape")){
target = GetNearestTaggedObject();
nearestObj.GetComponent("TargetSelectingIcon").DrawNone();
}
}
function GetNearestTaggedObject() : Transform {
// and finally the actual process for finding the nearest object:
var nearestDistanceSqr = Mathf.Infinity;
var taggedGameObjects = GameObject.FindGameObjectsWithTag("Enemy");
// loop through each tagged object, remembering nearest one found
for (var obj : GameObject in taggedGameObjects) {
var objectPos = obj.transform.position;
var distanceSqr = (objectPos - transform.position).sqrMagnitude;
var storeValue = new Array();
storeValue[taggedGameObjects.length] = distanceSqr;
storeValue.Sort(sortScore);
print(storeValue[taggedGameObjects.length]);
if (storeValue[taggedGameObjects.length] < nearestDistanceSqr) {
nearestObj = obj.transform;
nearestDistanceSqr = storeValue[taggedGameObjects.length];
}
}
}
function sortScore (a, b){
//sorts an array numerically ascending
return (a - b);
}
Comment
Answer by D0CT0RGRAY · May 11, 2012 at 05:34 AM
Found out the answer after extensive trial and error
I just needed a new array at the beginning:
var targetsInScene = new Array();
Then I needed to make sure it was getting set to the obj.transform from the associative array:
targetsInScene[i] = obj.transform;
And presto! I'm able to access objects in an associative array individually. There's probably a better method for this out there, but the best one I have right now is the one that works ^^