Jump to content
Unity Insider Forum

OnTriggerEnter tatsächlich vererbbar?


Garzec

Recommended Posts

Hi,

ich habe ein Portal, das beim Betreten eine Szene lädt. Nun gibt es ja im Spiel mehrere Portale und doppelter Code ist bekanntlich doof. Mein Ziel ist also möglichst elegant eine Basis zu schaffen, um hinterher neue Portale " am Fließband zu erzeugen".

Also habe ich folgende Struktur gebastelt,

// Basis Controller

public abstract class PortalCommonController : EnvironmentCommonController
{
    protected PortalData data;
    protected PortalView view;

    protected void OnTriggerEnter(Collider col)
    {
        if (CheckCollision(col, data.PlayerObject))
            LoadScene(data.SceneToLoad);
    }
}

// die Daten

public class PortalData : EnvironmentCommonData
{
    public PortalData(string sceneToLoad)
    {
        SceneToLoad = sceneToLoad;
    }

    public string SceneToLoad { get; set; }
}

// die View mit Animationen etc.

public class PortalView : EnvironmentCommonView
{

}






// das eigentliche Portal

public class PortalHubWorld : PortalCommonController
{
    private void Start()
    {
        data = new PortalData("Ingame");
        view = new PortalView();
    }
}

Da ich noch kein wirklich "erfahrener" Programmierer bin, möchte ich mal fragen, ob man tatsächlich OnTriggerEnter vererben kann. Ich habe es getestet, es funktioniert. Ebenfalls mit mehreren Portalen, zu unterschiedlichen Szenen. Es traten keine Fehler auf.

Aber OnTriggerEnter ist ja ein Event, ist es wirklich so klug, es zu vererben? Der Code an und für sich ist ja für weitere Portale sehr überschaubar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurze Antwort: Ja, kann man vererben.

Unity schaut per Reflection nach der Methode. Das heißt stumpf gesagt, dass in der Komponente, unabhängig davon, wovon sie erben, nach einer Methode mit einem bestimmten Namen gesucht wird. Vererbte Methoden können dabei auch gefunden werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soweit ich weiß ist "OnTriggerEnter" eine Methode der Klasse "MonoBehaviour" (seltsamerweise finde ich sie aber auch unter der Klasse "Collider"). Mich wundert, daß er ohne "MonoBehaviour" als Basisklasse seiner Klasse anzugeben überhaupt auf die Methode zugreifen kann, aber wenn Unity hier per Reflection sucht wäre das eine Erklärung. Ich hätte eher gedacht - im Sinne einer sauberen Lösung-, daß man den Inhalt in einer eigenen Methode kapselt und dann am Ende der Vererbungshierarchie diese Methode referenziert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja mein Basiscontroller erbt ja von EnvironmentCommonController und irgendwann erbt der oberste Controller von Monob. :)

Ich wollte nur fragen, ob dort Probleme auftauchen könnten, bzw. Dinge erst im Nachhinein kaputt gehen könnten.

 

Aber sehr cool, danke :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...