Jump to content
Unity Insider Forum

landvogt

Members
  • Content count

    9
  • Joined

  • Last visited

Community Reputation

1 Neutral

About landvogt

  • Rank
    Newbie
  1. landvogt

    Übergeordnete Klasse von GameObject

    Hallo Sascha, also, erstmal vielen Dank an Dich und dieses Forum ! Endlich tut's das, was ich will Ich habe jetzt an jedes Terrain-Prefab ein Script angeheftet, welches Methoden und Felder enthält. Wenn ich jetzt mit der Maus über ein GO der Map streiche, gibt mir meine "Mausmanager".class eine Referenz auf das GO zurück, über welches ich dann mit GetComponent die Methoden und Felder des angehefteten Scripts abrufen kann,wie z.B die Indices des Hex im Map-array usw.. Jetzt verstehe ich auf auch den Unterschied/Vorteil zu meine ursprüngliche Kapselung... Also nochmal fettes THX ! und LG
  2. landvogt

    Übergeordnete Klasse von GameObject

    Hi Sascha, erst einmal vielen Dank für die ausführlichen Hinweise und Hilfe ! Versuche gerade das alles umzusetzen : Zuerst habe ich ein "Empty" kreiert namens "Hex", dem habe ich mein "HexScript" angeheftet, eine class die von Monobehaviour erbt und einen Hexprefab - array enthält, sowie die Variablen q , r , die das Hexfeld in der Map indizieren und int Height. Und eine methode Position(); Um die Map zu erzeugen, benutze ich zwei for Schleifen, die q und r durchlaufen lassen und jedesmal ein Hex instanzieren sollen; Bisher hat das so funktioniert : for q { for r { AllHexes [q,r] = (GameObject)Instantiate ( HexPrefab [Height], // Terraintypen abh. von Höhe Positionqr(q,r), // Gamewelt-Vector-Methode, in Abh. von Position in Map rota); }} Da das GO aber noch nicht existiert, kann Position() nicht aufgerufen werden. Vorher war es so, dass Hex die Methode Position() bereitstellen konnte, da diese schon vor "instantiate" erzeugt war. Wie löse ich das nun in diesem Fall, also wie erzeugt man nun innerhalb der Schleife jeweils ein GO und übergibt die nötigen Parameter ? (Habe schon versucht "instantiate" in die start().Methode von HexScript zu verlagern, aber ohne Erfolg) LG
  3. landvogt

    Übergeordnete Klasse von GameObject

    Hmm, so ganz check ichs noch nicht.. Meine class Unit : Monobehaviour binde ich wie genau an ein GameObject ? Mit AddComponent ? Wie übergebe ich Parameter bei Erzeugung ? Könntest du mir noch etwas BeispielCode dafür geben ? Generell dachte ich mir, einen "Hashtable Units" zu erzeugen und eine neu erzeugte Unit mit Units.Add(index,Unit) oder Units.Add(index, GameObject) ?? darin aufzunehmen. Würde das so gehen ? Danke u. Gruß
  4. landvogt

    Übergeordnete Klasse von GameObject

    Ja, ok, danke. So ähnlich hatte ich es am Anfang, nämlich einen array mit den reinen Datenklassen und einen zweiten array mit den GOs. Ich hab halt gelesen, dass es u.U. Sinn macht, die Datenklasse behalten zu können und nur das GameObject zerstören zu können. Wie mache ich es, wenn meine Unit ausserhalb des Sichtradius liegt ,also kein GameObject dargestellt werden soll, aber weiterhin eine Simulation der Unit, z.B. Bewegung, stattfinden soll ? Wenn ich das GameObject zerstöre , gehen in diesem Fall ja auch alle Attribute verloren. Gruß PS : Oder existiert im Typ GameObject eine Art "Schalter", der das Object auf "invisible" stellt, den Rest aber unberührt lässt ? PPS : Bin gerade am testen, hab meine class : Monobehaviour mit paar Variablen und Methoden gefüllt. Wie übergebe ich der Unit Parameter bei "instantiate" ? Bisher konnte ich das ja einfach mit new machen und die Parameter im Konstruktor mitgeben, aber standard Konstruktor Aufruf geht ja bei Monobehaviour nicht .
  5. landvogt

    Übergeordnete Klasse von GameObject

    "Warum sollte das Objekt, das für die Grafik zuständig ist, Bewegungsbefehle auslösen?" Tut es ja nicht (das GO), sondern die Klasse, die das GO als Var enthält, tut das. Aber von vorn, sorry das das alles so unverständlich ist (bin rel. neu in oop und Unity, kann dafür aber noch ganz gut pascal und assembler ) Das Ziel ist ein kleines Game auf Hexfeldern, auf dem sich Einheiten bewegen und interagieren sollen. Dazu dachte ich mir, kapsele ich sowohl jedes HexFeld als auch jede Einheit "Unit" als class mit versch. Methoden ("Move" z.B.) und verpasse diesem eine variable vom typ GO. welche die zugehörige Grafik repräsentiert. grob etwa so : public class Unit { public GameObject VUnit; // UnitGrafik, durch "instantiate" aus prefab erzeugt public bool moveUnit(param ...): // bewegt EInheit, true wenn bewegt usw. public bool killUnit() // Einheit auflösen ... usw. } Ist das bereits falsch gekapselt ? Nun kann ich wie gesagt das GO, über welches die MAus grade überstreicht bekommen, aber nicht die Instanz der class "Unit" , die es beinhaltet... Ohne das kann ich aber nicht die jeweiligen MEthoden ausführen, die etwas mit der Unit tun. Gruß
  6. landvogt

    Übergeordnete Klasse von GameObject

    HI Sascha, naja, einfach von der "Grafik" (GO) auf die Instanz der verwaltenden Klasse "Unit" rückschliessen, um dann u.a. Methoden wie "MoveUnit" etc. in "Unit" durchführen zu können. Das funktioniert auch , wenn ich bei dem GameObject nach Erzeugung in "transform.parent.name" z.B. den Index aus dem UnitArray reinschreiben lasse. Bei MausHit gibt der String "name" des GO den korrekten Index zurück. z.B. "U3" , "U7" o.ä.. , aus dem String mache ich dann ein int und hab den korrekten Index aus dem "UnitArray". Damit sind dann MEthodenaufrufe aus "Unit" möglich, aber so ist das mit Sichherheit nicht gedacht .... , dachte halt, das geht eleganter ... Gruß.
  7. Hi, meine Klasse "Unit" erbt nicht von Monobehaviour, enthält aber eine Variable GameObject. Ungefähr so : public class Unit { public GameObject VUnit; } Per Physics.Raycast usw. wird erfolgreich das GameObject zurückgegeben, über das der Mauszeiger gerade fährt. Wie komme ich nun vom jeweiligen GameObject "VUnit" auf dessen Klasse "Unit" ? Mit "transform.parent" gehts nicht, weil ich dem GO "VUnit" nicht das parent "Unit" zuweisen kann, weil "Unit" selber nicht vom Typ GameObject ist ... LG
  8. Hi, Danke, dieses "Grid" gibts bei mir irgendwie nur als "Tilemap" ohne "Hexagonal" und wie man das auf hexagonal trimmt ... ka. LG
  9. 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
×