- Home /
The question is answered, right answer was accepted
[C#] Sorting a List of Gameobjects Alphabetically
i have this code, it find all gameobjects that are marked as a waypoint and adds it to a list/array.
using UnityEngine;
using System.Collections;
public class CreepAI : MonoBehaviour {
//Vars
public GameObject Target = null;
public GameObject[] WayPoints;
void Awake () {
FindWayPoints();
}
void FindWayPoints()
{
WayPoints = GameObject.FindGameObjectsWithTag("Waypoint");
}
void LateUpdate () {
if(Target = null)
Target = FindClosestEnemy();
FindWayPoints();
}
}
When i run the code the gameobjects are arranged in a way that makes no sense, they are not arranged in the world this way or in the hierarchy this way.
i want to be able to sort this list, so Wp0 will be first and Wp7 will be last in order.
It looks like you have a bug in your LateUpdate(), you probably meant to write "if(Target == null)" ins$$anonymous$$d of assigning Target = null every frame.
the part of the code is for something else that i cut out to save space when i pasted the code here. it being = and not == was a mistake, thanks for pointing it out.
Answer by Berenger · Jun 21, 2012 at 09:19 PM
Try (tested and approved) :
using System.Linq;
// ...
void FindWayPoints()
{
WayPoints = GameObject.FindGameObjectsWithTag("Waypoint").OrderBy( go => go.name ).ToArray();
}
THAN$$anonymous$$S A LOT!!!!! and yup Im yelling of happyness I tried many things but this is simply perfect!!
Answer by kersk · Jun 21, 2012 at 09:52 PM
After you grab all of the waypoints in FindWayPoints(), sort the WayPoints array by the waypoint's gameobject name.
Just to get you going, you can use Array.Sort -- check out MSDN
Try something like:
Array.Sort(WayPoints, delegate(GameObject wp1, GameObject wp2) { return wp1.name.CompareTo(wp2.name); });
(I didn't test that - no guarantees on that compiling!)
However, Array.Sort and GameObject.FindGameObjectsWithTag are both very slow. Probably not something you want to be doing everytime you create a new NPC. I'd recommend considering switching over to creating a gameobject named something like "WaypointRegistry" that also has a "WaypointRegistry" script that implements a singleton -- that script would do the work once to maintain your sorted list of waypoints in the scene, and then provide static and centralized access to this list. Your creeps could simply call something like "Waypoints = WaypointRegistry.GetAllWaypoints();"
It also looks like you have a bug in your LateUpdate(), you probably meant to write "if(Target == null)" instead of assigning Target = null.
Hope this helped!
thanks for the advice, i will defiantly use the registry idea.
Follow this Question
Related Questions
How to put gameObjects to the list? 4 Answers
What is the best way to instatiate an array of connected GameObjects? 0 Answers
Can't Activate a GameObject from Array 1 Answer
How would I find the name of all game objects in a c# List 1 Answer
Order a GameObject array based on an int property of each object? 1 Answer