Was ich auch mal benutzt habe, weil der Designer darauf bestand, die Tags zu verwenden:
Wir haben uns ein kleines Vokabular an kurzen Tags gebaut und dann einfach nur mit "Contains()" geprüft. Das ging bei uns glatt, weil es nie mehr als 100 Objekte gleichzeitig waren, die so geprüft wurden. Könnte ggf. also ein Kompromis sein.
Das ist mit Sicherheit eine Lösung und auch in den Tutorials von Unity werden Tags häufig genutzt - per se also nicht verkehrt. Meine Erfahrung hat aber gezeigt, dass die Verständigung mit dem Designer nicht notwendig ist, da es für ihn schlicht irrelevant ist und eine mögliche Fehlerquelle birgt - insbesondere durch die Redundanz. Die Identifizierung von Objekten zur Laufzeit sollte stets nur beim Programmierer liegen und absolut nichts mit dem Designer zu tun haben. (Überhaupt, warum hat der Designer das letzte Wort bei technischen Fragen?) Es ist ja auch völlig egal für ihn wie das Objekt heißt. Was passiert zum Beispiel im Fall (in Anbetracht zur überlegten Lösung der abstrakten Basisklasse), wenn man auf alle Einheiten prüfen möchte, die eine Lebenskomponente haben und diesen Schaden zuzufügen möchte, aber nur bei jenen die gegen Feuerschaden nicht resistent sind und keine Spieler sind? (Ich denke du verstehst auf was ich hinaus will) Damit kannst du dir kein Konstrukt über Tags bauen. Eine Bitmaske für solche Überprüfungen bietet Unity nicht und die Collisionmatrix (Layersystem) ist meiner Meinung nach nur zur nachträglichen Optimierung. (Sollte man nämlich etwas nachträglich erweitern, zum Beispiel um einen neuen Layer, müsste man diesen ggf. bei allen GameObjects in der Szene "anklicken" die ihn benötigen, oder ein extra Editorskript für diese Aufgabe bauen - unnötige, nervige Arbeit) Sobald man einmal mit Tags anfängt hat man zwar einen tollen Status Quo der sehr vernünftig wirkt, aber am Ende versperrt man sich entweder die Erweiterung oder muss umarbeiten. Und der Performanceunterschied in der Praxis ist zu vernachlässigen, da es lediglich kritisch wird, wenn man GameObjects mit sehr vielen Komponenten erstellt und dann macht man, meiner Meinung nach, sowieso etwas falsch.