Ich habe das gleiche, was du geschrieben hast, nochmal implementiert (wenn auch noch nicht ausreichend getestet), was fast das gleiche machen dürfte:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static class GameObjectExtensions {
public static T GetTypedComponent<T>(this GameObject gameObject) where T : class {
return gameObject.GetComponent(typeof(T)) as T;
}
public static T[] GetTypedComponents<T>(this GameObject gameObject) where T : class {
Component[] components = gameObject.gameObject.GetComponents(typeof(T));
T[] typedComponents = new T[components.Length];
for(int i = 0; i < components.Length; i++) {
typedComponents[i] = components[i] as T;
}
return typedComponents;
}
}
|
Die Änderungen:
Ich verwende Erweiterungsmethoden (erkennbar am ersten Parameter, vor dem ein "this" steht). Dadurch kann man auf jedem GameObject diese neuen Methoden aufrufen. (Interessant finde ich das in Kombination mit Enumerationen, da man so einer Enumeration Methoden anhängen kann, um sich wiederholende
switch-Blöcke zu vermeiden.) Und da man die Methoden direkt auf einem GameObject anwenden kann, kann man sie auch auf solchen anwenden, die nicht vom eigenen Typen abgeleitet sind.
Und ich werfe nicht so viele Fehler. Über die Exception bei einer Klasse statt eines Interfaces kann man sich ja noch streiten (ich würde es nicht als Ausnahmefehler ansehen, sondern höchstens eine Warnung ausgeben), aber alle anderen Esceptions sind gänzlich unnötig. Wenn man eine Komponente eines Typs haben möchte und diese nicht da ist, sollte stattdessen
null zurückgegeben werden (macht Unity auch so) und wenn man eine Menge von Komponenten eines bestimmten Typs abfragt, wovon aber keine einzige angehangen wurde, dann sollte man einfach eine leere Liste zurückgeben (macht Unity ebenfalls so und ist auch das einzig sinnvolle in diesem Zusammenhang).
Die Namen der Methoden sind durchaus verbesserungswürdig, allerdings dürfen diese ja nicht mit den bereits vorhandenen in Konflikt geraten... =/
Ob es eine bessere Performance abliefert, kann ich nicht sagen, der Unterschied sollte aber eigentlich zu geringfügig sein.