AgentCodeMonk Geschrieben 6. Mai 2014 Melden Share Geschrieben 6. Mai 2014 (bearbeitet) Wer kennt das nicht: Prefab gebaut und vergessen irgendwelche Scripts anzuhängen... Da gibt es wie immer verschiedene Möglichkeiten sowas abzufangen. Ein Weg, der mir ganz gut gefällt ist, einfach eine eigene "GetComponent"-Methode zu basteln, einem im Zweifelsfall etwas unter die Arme greift.. Ursprünglich kommt sie aus diesem Blog: http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ ,wurde ein wenig modifiziert und in (m)ein Helferlein eingebaut. using System; using UnityEngine; namespace GameFramework { /// <summary> /// /// </summary> public static class MonoBehaviourExtensions { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="behaviour"></param> /// <returns></returns> public static T GetSafeComponent<T>(this MonoBehaviour behaviour) where T : Component { return GetSafeComponent<T>(behaviour.gameObject); } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="gameObject"></param> /// <returns></returns> public static T GetSafeComponent<T>(this GameObject gameObject) where T : Component { var component = gameObject.GetComponent<T>(); if (component != null) return component; Debug.LogWarning("Expected to find component of type [ " + typeof(T) + " ] but found none", gameObject); Debug.LogWarning( "Trying to add Component [ " + typeof(T) + " ], just to prevent errors. MAYBE THE SCRIPT NEEDS TO BE SET UP!!!", gameObject); try { Debug.LogWarning("Added Component [ " + typeof(T) + " ] . MAYBE THE SCRIPT NEEDS TO BE SET UP!!!", gameObject); return gameObject.AddComponent<T>(); } catch (Exception) { Debug.LogError("Oh oh, couldn´t add Component [ " + typeof(T) + " ]", gameObject); } return null; } } } Um nun GetSafeComponent<ClassName>() anstatt GetComponent<ClassName>() nutzen zu können, kann man Folgendes machen: using UnityEngine; namespace GameFramework { public abstract class BaseTemplate : MonoBehaviour { public string Name = "Unknown"; /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public T GetSafeComponent<T>() where T : Component { return MonoBehaviourExtensions.GetSafeComponent<T>(this); } } } using UnityEngine; using GameFramework; public class Actor : BaseTemplate { private AnimationController _animationController; // AnimationController derives from MonoBehaviour private HealthController _healthController; void Awake() { Name = "Hans"; _animationController = GetSafeComponent<AnimationController>(); _healthController = gameObject.GetSafeComponent<AnimationController>(); } } Im Gegensatz zu GetComponent<ScriptName> ist das nur unwesentlich mehr Schreibarbeit. bearbeitet 8. Mai 2014 von AgentCodeMonkey Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 6. Mai 2014 Melden Share Geschrieben 6. Mai 2014 Ich bin kein Freund von dieser art Unterstützung (wenn die Komponente fehlt sollte man sie selbst hinzufügen um den Fehler komplett zu beseitigen) aber für den einen oder anderen sicher sehr nützlich. Dennoch habe ich ein paar Punkte die das Script verbessern würden: Mach GetSafeComponent zu einer extension Method an GameObject/MonoBehaviour, dadurch hast du das GameObject und musst es nicht immer beim Aufruf übergeben. AddComponent liefert dir die neue Komponente zurück, returne den Wert gleich dann brauchst du nicht noch extra GetComponent. 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Schlumpf Geschrieben 6. Mai 2014 Melden Share Geschrieben 6. Mai 2014 habe ich das richtig verstanden ich kann so z.b. das "miniscript" auf das objekt packen dann das projekt starten und das läd dann zur laufzeit andere scripte die fehlen nach indem es sie auf das aufrufende objekt quasi wie per drag n drop zieht falls es noch nicht vorhanden ist ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AgentCodeMonk Geschrieben 6. Mai 2014 Autor Melden Share Geschrieben 6. Mai 2014 @ Marrrk Jupp, deshalb wirft es die Warnungen! Es ist nicht gedacht um alles zu automatisieren, sondern um nicht gleich 1000 Fehler zu schmeissen. Eher ne Art Gedächtnisstütze, falls man doch mal was vergessen hat. Ansonsten gute Ideen^^ werde ich mal machen. @ Schlumpf Nunja, wenn du deine Scripts in der Awake oder Start Methode cachst, wovo ich ausgehe, hängt es automatisch das fehlende Script an, allerdings fehlen dir dann die Einstellungen durch den Inspector. Eigentlich soll es wie bereits gesagt dazu dienen Warnungen zu werfen und nicht gleich mit Fehlern um sich werfen. Wie Marrrk schon schreibt, das mag für den ein oder anderen nicht passen und am Ende sollte man es natürlich so machen wie Marrrk schreibt: Script von Hand auf das Objekt ziehen. Wenn man allerdings die GetSafeComponent Methode nutzt, bleibt das Spiel weiterhin spielbar. 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Schlumpf Geschrieben 6. Mai 2014 Melden Share Geschrieben 6. Mai 2014 aso da hat er eigentlich recht is also eher so ein "fail over mode" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.