Jump to content
Unity Insider Forum

Um 2D Objekte "herumlaufen"


Maltrix

Recommended Posts

Hallo,

Ich möchte ein 2D "Top Down" Action RPG im stiel von Zelda programmieren und bin noch dabei Unity und Programmieren zu lernen. 
Die Ansicht wird nicht klassisch Top Down sein sondern eher eine diagonale, frontale Draufsicht (man wird z.B von Häusern oder Erdhängen immer nur die Südwand sehen können)

Hier mein Problem: Ich möchte um z.B Bäume oder Gegner "herumlaufen" können also sprich, wenn die Füße meines Avatars leicht unterhalb eines Objektes oder Gegner sind soll mein Avatar sich in einem höheren Layer befinden und vor dem Objekt stehen. Befinden sich die Füße allerdings leicht oberhalb der Unterseite des Objekts, soll der Avatar hinter dem Objekt stehen.

Ich habe mir gedacht, vielleicht Colission Boxes am unteren viertel der Objekte zu platzieren und dann vielleicht über Code je nach X-Wert der Objekte die Layerreinfolge im Spiel zu ändern, habe aber absolut keine Ahnung wie ich das machen soll und ob es überhaupt geht.

Ich hoffe ich hab mein Problem verständlich genug geschrieben, ansonsten einfach nochmal nachfragen. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb Maltrix:

Ich habe mir gedacht, vielleicht Colission Boxes am unteren viertel der Objekte zu platzieren

Exakt richtiger Ansatz.

vor 4 Minuten schrieb Maltrix:

und dann vielleicht über Code je nach X-Wert der Objekte die Layerreinfolge im Spiel zu ändern

Ich hab da mal was geschrieben, das das gemacht hat, aber inzwischen habe ich zufällig bemerkt, dass Unity das von Haus aus kann. Witzigerweise findet man die Vanilla-Lösung kaum, wenn man sucht - es ist ein bisschen versteckt.

Du gehst auf "Edit", "Project Settings", "Graphics".

Dann stellst du "Transparency Sort" wie folgt ein:

AxisDistanceSort1.png

Obwohl hier ein Rahmen um die Achse ist, ist "Custom Axis" auch wichtig.

Sobald du das eingestellt hast, ordnen deine Kameras im Spiel nicht mehr danach, wie weit ein Renderer im Transparent Queue (wozu alle SpriteRenderer zählen) von der Kamera weg ist (Z-Achse), sondern wie weit entlang der Y-Achse der Renderer ist. Das greift nur, wenn die Renderer auf demselben Sorting Layer mit demselben Order in Layer sind. Wenn eine von beiden Eigenschaften unterschiedlich ist, hat das Priorität.

Seit Unity 2018.2 kannst du des Weiteren den Pivot eines Sprites als Referenzpunkt für das Sorting einstellen. Für deinen Fall willst du immer den Pivot der Sprites auf dem Boden-Berührungspunkt haben und den SpriteRenderer entsprechend einstellen. Stelle dir ansonsten einen großen Baum vor, hinter dem die kleinere Figur schon verschwinden wollen würde, wenn ihr Mittelpunkt noch unterhalb des Mittelpunkts des Baumes ist - allerdings liegt genau da das Problem, wenn du die besagten Einstellungen nicht vornimmst ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh cool,
danke, das werde ich dann bald mal ausprobieren
Du hattest es vermutlich bereits gemerkt aber ich meinte im Originalpost natürlich die Y-Werte und nicht die X-Werte^^

Aber ich verstehe dass dann so, dass ich da nicht mal was mit Code machen muss sondern das lediglich eine Einstellungssache ist?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerade eben schrieb Maltrix:

Aber ich verstehe dass dann so, dass ich da nicht mal was mit Code machen muss sondern das lediglich eine Einstellungssache ist?

Korrekt. Und es kostet nicht einmal zusätzlich, weil du nichts weiter tust als die Achse für das Sortierverfahren zu ändern, das Unity sowieso durchführt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb Sascha:

 Und es kostet nicht einmal zusätzlich, weil du nichts weiter tust als die Achse für das Sortierverfahren zu ändern, das Unity sowieso durchführt.

Was sollte es denn auch kosten?

Kurze Zusatzfrage noch gleich im Anschluss: Kann ich eigentlich mehrere verschiedene Colisson Boxes auf ein Objekt setzen und muss ich mich dabei an meine Tilegrößen halten?
Beispiel: Mein Avatar ist 16x32 px (also zwei Tiles (ein Tile = 16x16 px)) groß. Ich würde jetzt gerne am unteren Ende eine Box mit ca. 16x8 px haben um z.B vor Wänden stehen zu bleiben und eine Box mit 16x24 px  die dann als Hitbox fungiert. Eine Box wäre also nur ein halbes Tile hoch und das andere Ein einhalb. Ist das ein Problem?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Minuten schrieb Maltrix:

Was sollte es denn auch kosten?

Das war auf die Performance bezogen. Alle Script-Lösungen, die man online findet, benötigen logischerweise zusätzliche Prozessorleistung. War etwas uneindeutig ausgedrückt, sorry :)

vor 10 Minuten schrieb Maltrix:

Kurze Zusatzfrage noch gleich im Anschluss

Du kannst deine Collider bauen wie du lustig bist. Wenn dein Character z.B. minimal zu nah an eine Ecke gesteuert wird, wird er mit einem BoxCollider2D hängenbleiben. Wenn du stattdessen einen horizontalen CapsuleCollider2D benutzt, dann kann dein Character durch die abgerundeten Ecken die Ecke entlang in die Lücke gleiten. Generell gilt bei Collidern: Wenn es funktioniert und sich gut beim Testen anfühlt, dann ist es auch richtig.

Und ja, du kannst mehrere Collider auf ein GameObject packen. Für ein Objekt mit Rigidbody (oder Rigidbody2D) zählen übrigens auch alle Collider(2D), die auf untergeordneten GameObjects liegen. Du kannst also deine Collider, wenn du mehrere haben willst, auf mindestens ein Kind-Objekt auslagern, damit dein Hauptobjekt mit dem Rigidbody2D und/oder deinen Scripts nicht zu vollgemüllt wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Achso^^ Ja ok, häte ich mir auch denken können das du die Kosten so gemeint hast, sorry^^

Und cool, danke,

Ich muss ehrlich gesagt zugeben, dass ich den Großteil von dem was du geschrieben hast nicht ganz verstanden habe, weil mir die Fachbegriffe einfach noch fehlen aber ich kann mich daran zumindest langhangeln und nach und nach rausfinden was du gemeint hast^^ (Ich bin echt noch absoluter Noobie)

Aber was du geschrieben hast war definitiv sehr hilfreich also danke dafür!

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

Hey,

Ich hab das jetzt mal versucht und so ganz will es noch nicht gut klappen. Ich hab die Einstellungen vorgenommen die du mir vorgeschlagen hast und jetzt ist es so, dass ich immer dann hinter dem Baum verschwinde, wenn sich die Mittelpunkte beider Sprites überschneiden.
Ich gehe gerade davon aus, dass es mit der Sprite Renderer Einstellung zu tun hat von der du erzählt hast. 
Ich habe bei meinem Player und beim Baum "Pivot" eingestellt, konnte aber nirgendwo den untersten Punkt der Sprites als Referenz einstellen. Ich konnte nur zwischen Pivot und Center wählen und das wars.
Wo mach ich was falsch? 

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK,

Ich musste es über den Editor machen weil ich den Pivot meines Player Sprites nicht wie in deinem Bild einstellen konnte. Ich denke das ist so, weil mein Sprite Mode auf Multiple gestellt ist (logischerweise). Beim Baum wars einfacher der ist im Single Mode^^ 
Im Prinzip funktioniert es jetzt.... denk ich^^ 
Was mir noch sorgen macht ist, dass bei einer Kollision mein Sprite anfängt sich zu drehen (in 3D) und er ab und an durch die Gegend glitcht wenn ich hinter dem Baum langlaufe.
Das 3D drehen kommt vermutlich daher, dass ich meine Steuerung noch über transform.Translate(new Vector3()) mache und nicht über den Rigitbody aber ich bin mir nicht sicher, ob das Glitchen auch daher kommt. Ich muss schauen was passiert, wenn ich mein Controll Script überarbeite aber auf jeden Fall erstmal ein dickes Danke vorerst

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...