Jump to content
Unity Insider Forum
landvogt

Interaktion zw. verschiedenen Klassentypen (Monobehaviour und reine Datenklassen)

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

 

 

 

 

 

                                       

 

 

 

 

 

 

Share this post


Link to post
Share on other sites

Kann dir zwar nicht helfen, aber du weisst schon, das Unity 2d Hexagonale Tilemaps mitbringt?
GameObject->2D Object->Hexagonal Tilemap

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×