Jump to content
Unity Insider Forum

Interaktion zw. verschiedenen Klassentypen (Monobehaviour und reine Datenklassen)


landvogt

Recommended Posts

Hallo zusammen,

bin relativ unbedarft in Unity und OOP (noch angefangen Mitte 90 mit Pascal und Assembler :) ), habs nach einigen Tutorials in Blender und Unity aber doch geschafft, ein

"HexMap"-Objekt zu erstellen, was auch soweit funktioniert und eine Map mit unterschiedl. hohen Hexagonen (eigtl. Hexagonzylindern) ausgibt. Die Datenklasse "Hex" ist ganz simpel:

 

{

3 Koordinaten  :  int q, r, s                              // kubische Koordinaten weil math. alles einfacher

int Height                                                             //Höhe von 0-4 , "Ebene","Hügel#1"Hügel#2","Berg","Hochgebirge"

 Vector3 Position();                                        //  gibt die RealWelt- Koordinaten zurück in Abhängigkeit von q,r,s

}

Meine "HexMap" - Klasse erzeugt in zwei for Schleifen also jeweils ein "Hex"-Objekt und durch "instantiate" ein "HexGO" , das dazugehörige GameObject

aus einem (von der "Height" des Terraintyps des jew. Hexfledes  abh.) Prefab.

Der Verwaltung wegen dachte ich mir, store ich beide Typen  in  2d  arrays innerhalb der "HexMap" Klasse :

 

Hex[,] AllHexes = new Hex[MaxQ,MaxR];                                                        //alle reine DatenKlassen Obj)
 GameObject[,] AllHexesGO = new GameObject[MaxQ,MaxR];             //  alle HexGOs

 

Soweit passt alles, die prefabs werden korrekt mit  Textur dargestellt.

 

Hier meine erste Frage : Ist das halbwegs elegant (vor allem die zwei 2d arrays ) ?

Ich hab auch  versucht meiner reinen HEx-Datenklasse bereits ein eigenes GameObject zu spendieren, das also  zusammenzufassen.

Leider kann ich dann im "Hex"-Konstruktor aber nicht "instantiate" machen,weil es ja kein Monobehaviour ist...

Und wenn ich meine "Hex" Klasse von "Monobehaviour" oder "GameObject" erben lass will, gehts auch nicht.

 

Aber zumindest läufts soweit.

 

Dann wollte ich eine "Hero" -Klasse erstellen, welche eine "Figur" auf der Map darstellen sollte :

public class Hero  {

    public Hero(HexMap MyHexMap, int q, int r) {
        this.Q = q;
        this.R = r;
        this.H = MyHexMap;
        Debug.Log("Hero erzeugt");

 }

    public int Q;
    public int R;
    //   GameObject HeroGO;
    public HexMap H;

    public Vector3 PositionOnHex(){                                                                                 //schaut ins HexFeld, um den Realwelt-Vector3 für den Hero zu generieren 


        Vector3 pos = new Vector3();
        pos = H.AllHexes[this.Q,this.R].Position ();
        pos.y =(float)H.AllHexes[this.Q,this.R].GetHeight() * 0.5052f;                     // y-Koord. hier eigtl "z"  , also "Height"
        return pos;

    }
 

In der "HexMap" erzeuge ich den Hero so :

"

[Felder werden zuerst durch "GenerateMap" erzeugt]

    Hero Held = new Hero (this, 10, 10);                                      // erzeugt reines DatenObj
    GameObject HeroGO = (GameObject)Instantiate (        // erzeugt zugeh. GO)
            HexPrefab [5],
            Held.PositionOnHex(),
            Quaternion.identity,
            this.transform);

     MeshRenderer mrr = HeroGO.GetComponentInChildren<MeshRenderer>();       // Textur setzen
     mrr.material = HexMaterials [2];

"

 

Held.PositionOnHex() liefert die RealweltKoord. von HexFeld (10,10) inkl "Heigth",  um das Held-GO dort richtig zu setzen, diese verwendet aber die Methoden "Position()" u. "GetHeight()" aus der "Hex"-Klasse.

Aufgerufen über den Array 

"

 pos = H.AllHexes[this.Q,this.R].Position ();
 pos.y =(float)H.AllHexes[this.Q,this.R].GetHeight() * 0.5052f;   

"

Code compiliert, aber folgende Warnung :

"

NullReferenceException: Object reference not set to an instance of an object
Hero.PositionOnHex () (at Assets/Hero.cs:23)
HexMap.Start () (at Assets/HexMap.cs:17)

"

bei Zeile :

 pos = H.AllHexes[this.Q,this.R].Position ();

 

 

Leider erscheint kein "Held", was mache ich falsch ? Kann ich "MyHexMap" überhaupt so dem "Hero"-Konstruktor mitgeben ?

Ich dachte mir halt der Hero muss ja irgendwie wissen, zu welchem "HexMap" - Objekt er gehört ...

Wie gehts anders ?

Würde mich über etwas Hilfe sehr freuen !

 

LG Landvogt

 

 

 

 

 

                                       

 

 

 

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...