Jump to content
Unity Insider Forum

Gedanken zur Isometrischen Map mit Unity


Top-SecreT

Recommended Posts

Hallo ihr Lieben,

 

ich würde gerne mal Brainstorming mit euch betreiben da ich nicht so richtig weiß wie ich anfangen soll.

Ich möchte ein RTS Spiel in Unity programmieren welches 2D und mit isometrischer Karte sein soll.

Ich bin bereits auf die Tilemap und Grid Funktion von Unity gestoßen, habe jetzt versucht damit eine isometrische Karte zu erstellen. Dank der Rotationsparameter ging das auch gut. Jetzt frage ich mich allerdings...ich kann ja nur quadratische Sprites in diese Tile-Palette einfügen. Ich habe jetzt sozusagen ein quadratisches Gras-Tile welches im Script auf eine Map von 10x10 gelegt wird. Diese Map wird dann gedreht und geschwenkt dass die Ansicht isometrisch ist. Das funktioniert ja bei einem Gras-Tile ganz gut aber wenn ich jetzt ein Gebäude haben möchte muss das Sprite doch schon isometrisch sein oder nicht?

Aber ich finde jetzt keine Möglichkeit in die Palette isometrische Tiles einzufügen. Habe ich einen Denkfehler?

 

 

LG,

Daniela

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke es ist wesentlich einfacher das Haus als 3D-Modell zu entwerfen und dann isometrisch auf die Tiles anzupassen. Isometrische Sprites zu erstellen stelle ich mir da schon komplexer vor, kenne mich damit aber nicht wirklich aus:


Wenn ich mir das so ansehe, wird es auch komplex solch ein Haus in einzelne Tile-Sprites zu zerteilen, ich denke hier wäre es leichter ein großes Sprite (2d Textur) zu verwenden, welches dann über mehre Tiles geht... oder man zerteilt das Gebäude in Einzelteile, wobei jedes Einzelteil nur 1 Tile besetzt.
Wenn man es in Einzelteile zerlegt, wird es dann sehr wichtig, wie die Render-Reihenfolge dieser Sprites letztendlich gesetzt wird, hier braucht man dann wieder eine Art von Level-Editor. Und zurück zu deiner Ursprungsfrage, ja wenn du keine 3D-Modelle verwendest, sondern ein 2D-Sprite würde ich sagen muss es bereits isometrisch sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Top-SecreT:

Ich danke dir. Ja es sollen auf jeden Fall 2D Sprites werden. 

Aber ich kann dann Unitys Tilemap Funktion dafür nicht nutzen oder? Er dreht ja den Sprite sozusagen nach dem Einfügen. Oder mach ich was falsch.

Sobald du alles in 2D machen möchtest, kannst du die Perspektive nicht mehr über die Kamera herstellen. Die isometrische Perspektive muss also bereits beim Zeichen der Sprites beachtet werden. Wie gesagt, ich vermute die 2D-Grafik muss bereits korrekt isometrisch gedreht gezeichnet sein, aber ich bin kein Grafiker, vielleicht noch einmal so jemanden fragen. Ich habe einfach mal ein isometrisches Sprite genommen und um 30 Grad gedreht (untere Darstellung) und wie du siehst, ergibt dies kein "gerades Haus". Und wenn der umgekehrte Weg nicht funktioniert, dann kann man auch ein "gerades Haus" nicht über eine Rotation eines Sprites (= Tile) isometrisch korrekt abbilden:

VWLbobv.png

PS:
Ich habe mal nachgeforscht. Isometrische Tilemaps sind noch nicht direkt von Unity supported:
https://forum.unity.com/threads/isometric-tilemap-in-2017-2-0.484182/

Zitat

Unfortunately Iso and Hex layouts will not be in this 2017.2 release. This is due to the reasons I mentioned above.l

Solange du an dieser Stelle hier keine andere Option als "Rectangle" findest, wird es noch nicht unterstützt.
FZZdp3p.png

 


Es gibt aber Assets im Store, die dies schon leisten können:
https://assetstore.unity.com/packages/tools/sprite-management/isometric-builder-98848
https://assetstore.unity.com/packages/tools/sprite-management/isometric-2-5d-toolset-27851
https://assetstore.unity.com/packages/templates/systems/ultimate-isometric-toolkit-33032

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weis nicht genau was du machst, aber normal werden Tiles halt einer Tilemap zugeordnet und damit verwaltet die Tilemap quasi die Tiles und damit existiert nur die Tilemap als separates GameObjekt in der Scene. 

Vermutlich kann man dieses System erweitern (solang wie Unity es nicht selber implementiert), indem man eine eigene IsoTile-Klasse programmiert. In dieser Klasse müsste dann das Tile entsprechend gedreht werden.  Hier ein Einstieg in diese Codeklassen:
https://docs.unity3d.com/Manual/Tilemap-ScriptableTiles.html
https://github.com/Unity-Technologies/2d-extras 

Aber hier hört es bei mir dann auch auf, da wird es dann ziemlich komplex ;)

Ich denke du kannst es ggf. auch nur mit dem Solo-Tile weitermachen (ist das ein Tile-Asset welches du in die Szene ziehst ?). Dadurch das du hierbei für jedes Tile (Sprite) ein GameObjekt erzeugst ist das denke ich nicht optimal. Mich wundert auch, daß du das Tile da isometrisch drehen kannst (oder schaust du auf deine Sprites in der 3D-Ansicht?), aber wie gesagt hab die Unityversion 2017.3 bei mir noch nicht installiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja das ist ja die Frage wie es optimal gemacht wird. Mit der Tilemap geht es ja anscheinend nicht isometrisch. Was du verlinkt hast ist ja die Unity Tilemap Funktion. 

Jetzt hab ich sozusagen ein Prefab erstellt welches ich dann x * y Mal instanziere. Da ist jetzt auch nichts gedreht oder so sondern die Sprites sind isometrisch im 2D Raum. Die Anordnung habe ich eben berechnet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah ok, das Problem was ich eben auch sehe ist, du hast in Unity entweder eine 2D-Ansicht oder eine 3D-Ansicht, aber es gibt quasi keine isometrische 2D-Ansicht. Was ich beim Durchlesen einiger Projekte gesehen habe, man kann beispielsweise die 3D-Sicht verwenden und die isometrische Plane über 3D-Würfel aufbauen (und die Szene entsprechend im 3D-Raum drehen) und dann die isometrischen Sprites auf diese Würfel projizieren (hier braucht man vermutlich wieder einen speziellen Shader, der die originalen UVs des Würfels ignoriert) oder man nimmt eben die 2D-Ansicht, aber hier braucht man denke ich einen speziellen 2D-Mesh, den man berechnen müsste und den du nicht hast. Auf diesen Mesh könnte man wiederum die isometischen 2D-Sprites projizieren. Alles andere wäre dann nur ein Aneinanderreihen von 2D-Sprites und ein so tuen als ob.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bis jetzt scheint der Weg mit den Prefabs ganz gut zu funktionieren. Mal gucken ob ich damit noch gegen die Wand fahre oder ob das praktikabel ist.

Jede Koordinate ist ein GameObject, ich habe ein Array[x, y] welches das GameObject enthält. Zusätzlich habe ich jetzt einen Hover Layer der auch GameObjects für jede Koordinate enthält und je nachdem wo die Maus ist mach ich SetActive(false/true) um den roten Rahmen um das aktuelle Feld anzuzeigen (Was wahrscheinlich nicht so rechenintensiv ist wie GameObjects löschen und neu hinzuzufügen).

 

Mit Meshs hab ich leider noch gar keine Erfahrung. Aber wenn man keine GameObjects nimmt stelle ich es mir schwer vor mit dem "verwalten" der Koordinaten.

scene.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann man so machen, du solltest nur vermeiden, an jedes Gameobjekt ein Skript anzuhängen, daß könnte deine Performance extrem negativ beeinflussen. Optimal ist die Lösung nicht, da jedes Gameobjekt einen gewissen "Overhead" in Unity produziert. Aus was besteht denn nun dein Grid, sind das alles quadratische Sprites (ich kann leider bei meiner Unityversion (2017.1.2) nicht schauen, da ich noch keine Tiles erzeugen kann)? Sollten es quadratische Sprites ein (wovon ich mal ausgehe), dann sollte man für eine optimale Performance nach dem Designprozeß alle Sprites zu einem einzigen Mesh verbinden, dabei werden alle Quads der Sprites zu einem "Plane-Mesh" umgewandelt. Das könnte man aber immer noch machen, wenn man mit dem Layout der Szene komplett fertig ist ...

Geh in Unity mal in der Szeneview oben links auf "Shaded Wireframe", dann sieht du die Meshstruktur der Szene.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerade eben schrieb Top-SecreT:

Achso...ist ja merkwürdig...

Ich bin so vorgegangen dass ich Create Empty geklickt hab, dann das Sprite darauf gezogen habe und dass als Prefab gespeichert habe. Kann sein dass das falsch war :x

Vermutlich liegt es daran, daß du Tiles und nicht Sprites verwendest. Du kannst die Tiles auch komplett umgehen und einfache Sprites verwenden. Wenn du die Tilesmap von Unity sowieso nicht verwendest, brauchst du eigentlich auch Tiles nicht zu benutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das kann sein, in der Doku steht:
Tight:    This generates a Mesh based on pixel alpha value. The Mesh generated generally follows the shape of the Sprite. 
Note: Any Sprite that is smaller than 32x32 uses Full Rect, even when Tight is specified.

Ich würde aber auf "Full Rect" umstellen, da dies performanter zu rendern ist. Die GPU rendert letztendlich Triangles (Dreiecke) und ein Quad sind 2 davon. Wird bei Tight ein komplexeres Mesh für das Sprite erzeugt bekommt die GPU später mehr zu tun und das ist bei einem eh quadratischem Sprite (und Szenensetting)  unnötig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb Top-SecreT:

Ah ok. Super ich bin sehr dankbar für Performance Tips :D

Macht sich denke nur auf einer Mobilplattform bemerkbar, aber immerhin. Kann sein, daß du die Sprites später nicht verbinden muss, da diese Unity intern eh automatisch macht. Sieht man dann später in der "Stats Anzeige" (siehe Gameview) unter Batches. Hier sollte dann etwas > 0 stehen.

Hier kannst du es sehen, die Sprites werden über Unity gebatched. "Saved by Batching":  9 ( weil es 10 Sprites sind) und es werden in Summe nur 26 Dreiecke gerendert. Das ist so ziemlich optimal.

9f8B5dU.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...