Jump to content
Unity Insider Forum

Terep

Members
  • Content count

    9
  • Joined

  • Last visited

Community Reputation

0 Neutral

About Terep

  • Rank
    Newbie
  1. Hallo Nach einer mehrjährigen Pause habe ich auf die aktuelle Unity Version 5.5.4p4 Personal (64bit) aktualisiert. Um wieder ein Gefühl für Unity zu bekommen, habe ich das Tutorial SpaceShooter gestartet. Dabei stelle ich fest, dass in der Hierarchy so gut wie keine Gameobjekte gezeigt werden. ich habe die Complete-Game Version gestartet. Dort tauchen nur die Licht-Objekte auf. Dies kann ich nicht nachvollziehen. Warum ist das so? Muss ich in der Scene auf das Objekt klicken, damit ich es im Inspector bearbeiten kann? Nach meiner Sicht war die strukturierte Auflistung aller Gameobjekte sehr nützlich. Terep Erledigt: Ich hatte im Filter Ligthing stehen. So war alles ausgeblendet.
  2. Terep

    Monodevelop Frage

    Hallo Ugeen Meinst Du vielleicht folgendes: Im Menue "View" steht als erstes Solution. Ist das markiert, werden links keine Infos gezeigt. Aktivierst Du Debug erscheint das Menue mit Kästchen und so. Terep
  3. Hallo In meinem ersten Posting „Einfache Funktions-Landschaft mit XY-Koordinaten generieren“ war ich von unity noch zu weit weg. Jetzt habe ich mich mit tile-mapping beschäftigt und versucht, mir dies zu erarbeiten. Am besten klappt es, wenn ich es als Tutorial formuliere. Dann bleibe ich besser am Thema. Dies hat auch alles gut geklappt. Was mich interessieren würde ist die Frage, ob ich die Sachen richtig beschreibe oder ob ich wegtriffte. Es folgt meine Ausarbeitung: Text-Tutorial Eine 2D-Welt mit tiles also mit einer Tilemap erstellen Teil 1 Die Map darstellen Wer mit der Überschrift nichts anfangen kann, bitte nach dem Stichwort Bilder zu einer Tilemap surfen. Der erste Gedanke ist es, hier Gameobjekte vom Typ Plane als Basis zu verwenden. Diesen kann man mit einer Textur versehen und mit Scale soweit verkleinern, dass es möglich ist, so eine Landschaft zu generieren. Nur sind diese tiles als klein gedacht. Ein Landschaftsausschnitt mit der Fläche 100 * 100 hat schon 10.000 Gameobjekte vom Typ Plane. Jede Plane hat per Definition eine Größe von 10 * 10 Quards. Ein Quard besteht aus 2 Tris (Dreiecken). Das heißt bei 10.000 Gameobjekten * 200 Tries mal 60 Framerate pro Sekunde. Eine gewaltige Zahl. Folglich ist die Performance schon miserabel, obwohl noch nichts passiert ist. Dieser Lösungsweg wird zur Sackgasse. Hier gibt es natürlich Alternativen. Zum Beispiel werden wir jetzt ein eigenes Mesh generieren. Einfach gesagt, besteht ein Mesh im Wesentlichen aus Dreiecken. Für unsere Landkarte brauchen wir also nur 2 Dreiecke zu einem Rechteck zusammenfügen, unsere vorbereitete Karte als Textur verwenden und fertigt ist es. Ist dies vorbereitet, merkt man nicht, was für ein Aufwand dahinter steht. Man klickt halt zusammen und ist vielleicht irritiert, dass so viele Spiele ganz ähnlich daherkommen. Individuelle Spiele verlangen entsprechenden persönlichen Einsatz. Das sollte Grund genug sein, das Folgende zu Lesen. Vorweg, inspiriert hat mich die englisch gesprochene Unity 3D Tutorial Serie von quill18creates TileMaps #2 und das Buch „Spiele entwickeln mit Unity“ von Carsten Seifert. Wir beginnen in unity in einer 3D-Umgebung in dem wir ein leeres Gameobject (create empty) erstellen und es in „TileMap“ umbenennen. Danach ziehen wir es aus der Historie in die Assets und erhalten so ein Prefab Was gehört jetzt eigentlich inhaltlich in das noch leere Gameobjekt? Im ersten Gedankengang hatten wir das Gameobjekt Plane verwendet. Nur aus Performancegründen haben wir dies nicht weiterverfolgt. Die Plane hat all dass, was wir brauchen: Mesh -Filter, -Collider und -Renderer. Wir werden jetzt sehen, wie funktional Scripte sind. Jetzt erzeugen wir ein c-sharp Script mit der Bezeichnung „TileMap“ und fügen es als Komponente dem Gameobjekt TileMap zu. Wir rufen das Script auf. Um Komponenten per Script hinzuzufügen, müssen wir unter den using-Anweisungen die benötigten Komponenten Mesh -Filter, -Collider und -Renderer nur anfordern. Wir löschen die void-Update-Methode und formulieren eine bildeMesh Methode. Da diese Methode nur einmal aufgerufen werden darf, kommt der Methodenaufruf in Start() auf. Das Script sieht jetzt wie folgt aus: using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshCollider))] public class TileMap : MonoBehaviour { void Start () { bildeMesh (); } void bildeMesh () { } } Testweise starten wir und prüfen so, ob Fehler vorliegen. Sehen tuen wir im Game-Schirm noch nichts. Was auffällt, die required-Komponenten sind jetzt im Gameobjekt vorhanden. Wenn nicht, einmal das Script entfernen und erneut als Komponente hinzufügen. Es geht im Script innerhalb von bildeMesh weiter Wir wollen ein Mesh Objekt erzeugen auf dem wir auf einem Rechteck die Landkarte darstellen. Das Rechteck wird durch zwei Dreiecke gebildet. Die Eckpunkte der Dreiecke sind die vertices. Da wir in 3D arbeiten, werden die vertices mit Vector3 Variablen angegeben. Wichtig ist die Reihenfolge bei der Nennung der Eckpunkte. Diese müssen im Uhrzeigersinn erfolgen. Konkret: das Rechteck: oben links = 0, oben rechts = 1, unten links = 2, unten rechts = 3 Das erste Dreieck: Oben = 0, unten rechts = 3, unten links = 2 Das zweite Dreieck: Oben links = 0, oben rechts = 1, unten = 3 Die erforderlichen Daten müssen wir vor der Mesherzeugung angeben. Dies machen wir in der bildeMesh-Methode mit Arrays. Vector3[] vertices = new Vector3[4]; int[] triangle = new int[6]; Jetzt benötigen wir noch normals für die Ausrichtung. Vector3[] normals = new Vector3[4]; Die einzelnen Arraydaten sind im Script unten gelistet. Jetzt können wir das Objekt erzeugen und die Daten übergeben Mesh mesh = new Mesh (); mesh.vertices = vertices; mesh.triangles = triangles; mesh.normals = normals; Wir schaffen Zugriffe auf die Komponenten: MeshFilter mesh_filter = GetComponent<MeshFilter> (); MeshRenderer mesh_renderer = GetComponent<MeshRenderer> (); MeshCollider mesh_collider = GetComponent<MeshCollider> (); mesh_filter.mesh = mesh; Die bisherige bildeMesh () Methode void bildeMesh () { // Das Rechteck benötigt 4 Punkte im 3dimensionalen Raum Vector3[] vertices = new Vector3[4]; vertices [0] = new Vector3 (0, 0, -1); vertices [1] = new Vector3 (1, 0, -1); vertices [2] = new Vector3 (0, 0, 0); vertices [3] = new Vector3 (1, 0, 0); // Ein Dreieck benötigt 3 Punkte mal 2 Dreicke = 6 int[] triangles = new int[6]; triangles [0] = 0; triangles [1] = 3; triangles [2] = 2; triangles [3] = 0; triangles [4] = 1; triangles [5] = 3; // Ausrichtung, hauptsächlich für die Lichtberechnung Vector3[] normals = new Vector3[4]; // die ausführliche Schreibweise: normals [0] = new Vector3(0, 0, 0); normals [0] = Vector3.up; normals [1] = Vector3.up; normals [2] = Vector3.up; normals [3] = Vector3.up; // Mesh wird erzeugt Mesh mesh = new Mesh (); // die Basis-Daten werden den Mesh-Membern mitgeteilt mesh.vertices = vertices; mesh.triangles = triangles; mesh.normals = normals; // Die Daten unseren Komponenten übergeben MeshFilter mesh_filter = GetComponent<MeshFilter> (); MeshRenderer mesh_renderer = GetComponent<MeshRenderer> (); MeshCollider mesh_collider = GetComponent<MeshCollider> (); mesh_filter.mesh = mesh; } Wenn wir jetzt starten, kommt ein rosa Rechteck. Es ist nur schräg sichtbar. Stellen wir im Gameobjekt Tilemap Rotation x auf 90 bzw. auf 270, schon ist es besser. Warum, es fehlt das „material“ auf dem die Textur kommt, unsere persönlich erstellte Karte. Wenn wir keine haben, können wir ein x-beliebiges Bild nehmen und es als Textur wie folgt verwenden. Wir create material und benennen es MatKarte. Wir klicken auf MatKarte und es erscheint im Inspector. Jetzt können wir unsere Textur darauf ziehen. MatKarte fügen wir als Komponente der TileMap zu. Wir starten und sehen zwar nicht mehr pink aber auch nicht unsere Textur. Das liegt daran, dass wir unity sagen müssen, wo genau die Karte hin muss. Wir sehen zwar eindimensional die Karte, unity arbeitet aber mehrdimensional. Stichwort UV-Map. Wir erzeugen einen Vector2 Array. Wir müssen die 4 Eckpunkte unseres Rechtecks angeben. Wir ergänzen unser Listung um Vector2[] uv = new Vector2[4]; uv[0] = new Vector2(0, 0); uv[1] = new Vector2(1, 0); uv[2] = new Vector2(0, 1); uv[3] = new Vector2(1, 1); Jetzt sollte es aber klappen. Ist das Bild noch verzerrt, hängt es an der Größe der TileMap. Im Verhältnis der Bildgröße (Breite, Höhe) in Transform Scale verkleinern und die Position anpassen. Das komplette Script: using UnityEngine; using System.Collections; [ RequireComponent(typeof(MeshFilter) ) ] [ RequireComponent(typeof(MeshRenderer) ) ] [ RequireComponent(typeof(MeshCollider) ) ] public class TileMap : MonoBehaviour { // Use this for initialization void Start () { bildeMesh (); } // Update is called once per frame void bildeMesh () { Vector3[] vertices = new Vector3[4]; int[] triangles = new int[6]; Vector3[] normals = new Vector3[4]; Vector2[]uv = new Vector2[4]; vertices [0] = new Vector3 (0, 0, 0); vertices [1] = new Vector3 (100, 0, 0); vertices [2] = new Vector3 (0, 0, -100); vertices [3] = new Vector3 (100, 0, -100); triangles [0] = 0; triangles [1] = 3; triangles [2] = 2; triangles [3] = 0; triangles [4] = 1; triangles [5] = 3; // die ausführliche Schreibweise: normals[0] = Vector3 (0, 0, 0); normals[0] = Vector3.up; normals[1] = Vector3.up; normals[2] = Vector3.up; normals[3] = Vector3.up; uv [0] = new Vector2 (0, 0); uv [1] = new Vector2 (1, 0); uv [2] = new Vector2 (0, 1); uv [3] = new Vector2 (1, 1); Mesh mesh = new Mesh (); mesh.vertices = vertices; mesh.triangles = triangles; mesh.normals = normals; mesh.uv = uv; MeshFilter mesh_filter = GetComponent<MeshFilter> (); MeshRenderer mesh_renderer = GetComponent<MeshRenderer> (); MeshCollider mesh_collider = GetComponent<MeshCollider> (); mesh_filter.mesh = mesh; } } Das ist mein Einstieg ins Tile-Mapping Terep
  4. Hallo Sleepy Meine Frage ist, wie habe ich Zugriff auf Merkmale des jeweiligen Grafikdetails. Mein aktueller Lösungsansatz: Als Einstieg werde ich in Gimp eine Landkarte zeichnen und in unity hinterlegen. Für die entsprechenden Gameobjekte wie Avatare versuche ich dann auf die Transform-Komponente zuzugreifen, um die XY-Koordinaten zu kriegen und diese dann in ein Koordinatensystem Integer umzusetzen. Dann kann ich hinterlegen, was bei welchen Koordinaten sein soll, wenn dort kein GameObjekt diese Funktion ausübt. Mein erstes Hauptziel ist es, eine Welt zu zeigen, in der auch eine Anzeigetafel für die Merkmale und Aktivitäten des Avatars vorhanden ist. 3D Objekte per Blender will ich erst verwenden, wenn ich die Spielverwaltung im Griff habe. Danke für die Tipps. Meine Fragen sind deshalb so unscharf, weil ich nicht nahe genug an unity dran bin. Das werde ich durch Tun ändern. Terep
  5. Hallo Sleepy Bis jetzt habe ich im Wesentlichen nur auf der Konsole programmiert. Mit einer grafischen Darstellung habe ich keine Erfahrung. Monopoly hatte ich mal als Spiel ohne Grafik programmiert. Die Verknüpfung zu einer grafischen Oberfläche machte mir Schwierigkeiten. In c-sharp kann ich sagen, der Avatar wird jetzt auf dem xy-Koordinaten 3, 4 gesetzt. Mit einem paint-Befehl kann man das dann malen lassen. Hier generiere ich nicht mit paint-Befehlen das Spielfeld sondern mit der engine unity. Und genau hier möchte ich gerne einstiegen. Ob ich jetzt ein Monopoly Spiel, ein Mensch Ärgere Dich nicht oder eine vereinfachte Spielwelt wie Ultima 3 generiere ist im Prinzip egal, wenn ich weiß wie. Und genau das ist es, „Wissen wie“. Terep
  6. Hallo Damon93 Deine Zusammenfassung ist in Ordnung. Nur auf gute Grafik lege ich jetzt noch keinen Wert. Das lenkt mich nur ab. Zuerst will ich unity besser verstehen und meine Spielwelt sehr einfach halten. Die Spielwelt will ich nicht per Code generieren, sondern darauf meine Spiellogik verwalten. Das heißt, die Landschaftsarten werde ich schon als Texturen darstellen. Nur ist mir nicht klar, wie ich es in unity umsetze. Bilde ich eine Landschaft, in dem ich als Beispiel 1000 x 1000 Gameobjekte (Plane) generiere und mit Hilfe von Prefabs die Landschaft bilde? In C-sharp habe ich grafikmäßig nur mit Windowsforms rumgemacht. Jetzt möchte ich sehr gerne die Möglichkeiten von unity nutzen, um so etwas zu gestalten. Der Grundgedanke ist der, wenn ich eine Teillandschaft habe, kann ich einen Avatar darauf bewegen. Daten, zum Beispiel, wo er ist, (XY- Daten) im Display zeigen und laufend aktualisieren. Anschließend dem Avatar klassische Eigenschaften geben: Er verbraucht Energie und muss Essbares finden. So habe ich vor, schrittweise eine Welt zu generieren, wobei in dieser Stufe die Optik nicht zu wichtig ist. Spielspaß wird da noch nicht groß vorhanden sein. Meine Schwierigkeiten liegen darin, dass ich Tutorials nachgeproggt habe. Danach verbleibt eine Art Blackbox, man sieht, es geht, aber selber umsetzen ist eine ganz andere Sache. Da ich mit der Landschaft noch Schwierigkeiten habe, surfe ich halt rum, kriege viele Anregungen, aber leider keine lineare Lernstruktur. Der Einstieg ist schwieriger als ich dachte. Terep
  7. Danke für die prompten Antworten. Sleepy hat mich mit der Bemerkung „… in der wundersamen Welt der Spiele Entwicklung mit Unity“ begrüßt. In dem Satz steckt viel Wahres. Die Tutorials geben einen Eindruck von der unity-Leistungsfähigkeit. Nur mit der persönlichen Umsetzung hapert es. Ich fremdle noch ganz gewaltig mit unity. Mein Ziel mit der Spielwelt muss ich wohl nach hinten schieben. Erst einmal muss ich mich in die Lage versetzen, getestete Tutorials ohne Vorlage nachzuproggen. Eine Grundfrage habe ich noch, in C-sharp war es nicht ratsam, hunderte von Windows-Form-Komponenten zu verwenden. In Unity sehe ich als Gegenstück das GameObjekt. Wo ist hier die Obergrenze? Mein PC ist nicht mehr der „Jüngste“. Also noch einmal Danke für das Antworten auf eine so „halbgare“ Frage. Terep
  8. Hallo Sleepy Das Grinsen kann ich verstehen. Ich denke hier an Ultima 3. Da ist die Grafik sehr einfach gehalten. Ich habe es wie folgt vor. Eine einfache 2D-Landschaft wie Wiese, Wald, Wasser. Ein Avatar soll auf die unterschiedlichen Landschaften reagieren. Nur soll diese Landschaft in dieser Stufe sehr einfach gemalt sein aber Eigenschaften haben. Der Avatar soll sich darauf bewegen. Wichtig ist es für mich, dass ich XY-Koordinaten habe und abfragen kann, auf welche Geländeart er sich befindet. Oder anders gefragt: Wenn Du ein Monopoly programmieren möchtest, wie würdest Du das Spielfeld mit den 40 Spielfeldern darstellen und verwalten? Mit C-sharp kann ich halbwegs umgehen. Da muss ich immer mit paint Malbefehle geben um Optik zu erzielen. In unity kann ich das Prinzip GameObjekt noch nicht mit dem Spielfeld verknüpfen. Daher will ich eine ganz einfache 2D-Welt aufbauen und darin experimentieren. Vom kompletten Spiel träume ich, das gebe ich zu. Habe dazu auch schon einige Versuche hinter mir. Bei c-sharp ist für mich der Grafikbereich immer sehr stressig. Nicht von der Optik her sondern von der Physik, wie sich was bewegen soll. Terep
  9. Hallo Als Hobbyist habe ich c-sharp Erfahrung und bin jetzt auf unity gestossen. Einige Tutorials habe ich durchgestöbert und festgestellt, dass mein Lerneffekt nicht wirklich hoch ist. Daher möchte ich ein Spiel-Projekt beginnen, in dem ich sehr einfach starte und dann Schritt für Schritt verfeinere. Als Spieltyp denke ich an die alten Ultima-Spiele. In der ersten Phase würde ich gerne die Oberfläche der Spielwelt formen. Dabei möchte ich in dieser Phase keine Terrain-Tools verwenden, sondern die Geländearten wie Wasser, Wald, Grass, Berge, Sumpf usw. in Fliesenform selbst generieren. Die Geländearten haben jeweils ihre Eigenarten. Später kommen dann Objekte hinzu. Ist es sinnvoll, wenn ich eine große Grund-Plane erzeuge und dann für die einzelnen Geländearten kleine Gelände-Plane-Einheiten erzeuge und dann als Prefabs zum modulieren der Landschaft nehme? Wie soll dann der einzelne Baustein für die Landschaft sein? Quadratisch, sechseckig? Der Avatar soll sich auf diese Landschaftsarten entsprechend verhalten. Dies will ich dann in Scripts formulieren. Die Optik interessiert mich im Moment wenig. So etwas wie die Terrain Assets würde ich erst dann verwenden wollen, wenn die Spiellogik funktioniert. In der ersten Stufe soll ein Avatar sich auf dieser Landschaft bewegen können. Gerne würde ich ein Koordinatensystem haben, um mit jeder Bewegung auf einem Info-Label die XY-Koordinaten anzuzeigen. Könnt ihr mir einen Tipp geben, wie ich die Landschaftsgestaltung angehe? Terep
×