landvogt Geschrieben 8. November 2018 Melden Share Geschrieben 8. November 2018 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 More sharing options...
Thariel Geschrieben 9. November 2018 Melden Share Geschrieben 9. November 2018 Kann dir zwar nicht helfen, aber du weisst schon, das Unity 2d Hexagonale Tilemaps mitbringt? GameObject->2D Object->Hexagonal Tilemap Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
landvogt Geschrieben 9. November 2018 Autor Melden Share Geschrieben 9. November 2018 Hi, Danke, dieses "Grid" gibts bei mir irgendwie nur als "Tilemap" ohne "Hexagonal" und wie man das auf hexagonal trimmt ... ka. LG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thariel Geschrieben 9. November 2018 Melden Share Geschrieben 9. November 2018 Schau hier: https://docs.unity3d.com/Manual/Tilemap-Hexagonal.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.