Jump to content
Unity Insider Forum

Die Anfänge des Objekt orientiertes programmieren


SchneeSniperLevel

Recommended Posts

Hallo Ihr Lieben

Ich bin im Moment mir Objekt orientiertes programmieren beizubringen. Leider ist das nicht mal so einfach^^ ich stehe an einen Punkt wo ich das Problem nicht mehr sehe....

Ich habe 2 Scripts die mit einander Kommunizieren sollten. Das Script A gibt nur eine vorgelegte Variable an Script B weiter. Im Script B folgt dann die Berechnung der Variable:

Script A

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Script_A : MonoBehaviour {

    Script_B script_b = new Script_B();

    public void Update()
    {
        Debug.Log(script_b.resultat1(10));
        Debug.Log(script_b.resultat2(50));
    }
}

 

Script B

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Script_B : MonoBehaviour
{
    public GameObject objekt;


    public float resultat1(float a)
    {
        float zwischenresultat = a + objekt.transform.eulerAngles.y;
        return zwischenresultat;
    }


    public float resultat2(float b)
    {
        float resultat = b + (2 + 3);
        return resultat;
    }
}

Warum bekomme ich da die Fehlermeldung: "NullReferenceException: Object reference not set to an instance of an object" bei der ersten Methode. Obwohl ich das Objekt extra noch über den Editor referenziere. Und die zweiten Methode Funktioniert Fehler frei, wenn die erste ausgeklammert ist.

 

Ich habe da glaub was grundlegendes nicht verstanden...

Beste Grüsse und schon mal vielen dank im voraus :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, erstmal kannst du Dinge aus Lehrmaterial zu objektorientiertem Programmieren nicht unbedingt auf Unity-Klassen übertragen. Beide deine Klassen erben von MonoBehaviour, was sie zu Komponenten macht. Und Komponenten darfst du niemals über new erzeugen.

Ein üblicher (aber nicht der einzige) Weg, dass ein Objekt ein anderes kennenlernt, ist über GetComponent. Dafür ziehst du beide Scripts auf dasselbe GameObject. Dann kannst du, am besten in Awake, die eine Komponente die andere aussuchen lassen:

Script_B script_b;

private void Awake()
{
  script_b = GetComponent<Script_B>();
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja, auch OOP kann man in Unity benutzen - und auch lernen. Aber in Unity gibt's halt noch komponentenbasiertes Design obendrauf, und beides gleichzeitig zu lernen (und auseinanderhalten zu müssen) macht den Lernprozess wesentlich schwerer als nötig. Wenn dir ein brauchbarer Lehrer OOP mit Unity beibringen will, ist das vermutlich okay, aber auf eigene Faust wirst du immer wieder in (unnötige) Verständnisprobleme wie dieses laufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja vielen Dank für eure Hilfe und mit diesem Code beispiel von dir Sascha hat es dann auch geklappt. Danke dir noch Mals. Ja ich lerne OOP , um Ordnung in meine Scripts zu bringen. So, dass ich  einzelne Funktionen auf einzelne Scripts verteile.Vorher habe ich alles in ein Script geschrieben und habe somit den überblick verloren. Weis ja nicht ob das der richtige Weg ist, weil dies in Unity so komisch gelöst ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Stunden schrieb SchneeSniperLevel:

so komisch

Wenn du mich (und viele andere fragst), ist Komponenten-Design, gerade für Spiele, wesentlich besser als klassisches OOP. Wenn man seinen Code in verschiedene logische Einheiten (Klassen) aufteilt, dann kann man das noch gar nicht richtig OOP nennen. OOP bedeutet, Klassen voneinander erben zu lassen und damit eine hierarchische Ordnung herzustellen. Das ist für Spiele oft mehr schlecht als recht. Stattdessen voneinander abhängige Komponenten zu bauen, ist nicht ohne gutem (!) Grund der Weg, wie man das in Unity macht.

vor 17 Stunden schrieb SchneeSniperLevel:

Vorher habe ich alles in ein Script geschrieben und habe somit den überblick verloren.

Ja gut, das sollte man so oder so vermeiden :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...