Jump to content
Unity Insider Forum

Simulierte 3D in 2D Game


Ismoh

Recommended Posts

Hallo zusammen,

der ein oder andere mag Little Fighter 2 noch kennen.

little-fighter-2-1_1-1-6.jpg

Bei LF2 kann man nach oben und unten gehen.

Meine Frage ist:

Wie sollte man das am besten in Unity umsetzen?

3D Projekt mit 2D Billboards?

2D Projekt mit isKinematic Rigibodies und Collidern?

2D Projekt mit "Standard" 2D Komponenten und Gravity auf 0?

 

Ich würde mich über einige Ideen oder Hinweise sehr freuen.

 

Gruß Ismoh

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sehe da keinen Unterschied zu Parallax Scrolling, das man sowieso bei 2D-Spielen verwendet (du hättest hier dann eine Ebene pro Figur), nur das du die Ebenen eben auch in Z-Richtung verschiebst. Ansonsten kommt es darauf an, was du in dem Spiel umsetzen möchtest. Solange du im 2D-Raum bleiben kannst, würde ich immer ein 2D Projekt verwenden, also 2D RB und 2D Collider. Benötigst du spezielle Kollisionsabfragen - wie z.B. ein Gegner kann einen anderen Gegner von hinten schlagen - könnte man auch darüber nachdenken, 3D RBs und 3D Collider zu verwenden. Man kann dies allerdings eben auch gut skripttechnisch lösen, von daher würde ich - auch der Performance wegen - erst einmal bei 2D bleiben.

Zu der Variante 2D ohne RB und Collider kann man auch wieder nur sagen, skripttechnisch kann man zwar alles irgendwie lösen, aber einfacher umzusetzen wäre es mit 2D RBs und 2D Collider, auch wenn das eventuell ein wenig Performance kostet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hey

ich habe schon öfters spiele gemacht mit little fighter als vorbild. grundsätzlich benutze ich dafür immer nur 2d rb und 2d collider. gravity brauche ich nicht bzw war bei mir nie sinnvoll. damit objekte hintereinander vorbeilaufen benutze ich die y position vom sprite und übertrage sie sinnvoll auf die z position (genauer gesagt auf die order in layer variable bei der sprite komponente)

springen habe ich bisher noch nicht realisiert, aber mit ein paar tricks ist das mit dem aufbau auch möglich

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Zer0Cool:

Ich sehe da keinen Unterschied zu Parallax Scrolling, das man sowieso bei 2D-Spielen verwendet (du hättest hier dann eine Ebene pro Figur), nur das du die Ebenen eben auch in Z-Richtung verschiebst. Ansonsten kommt es darauf an, was du in dem Spiel umsetzen möchtest. Solange du im 2D-Raum bleiben kannst, würde ich immer ein 2D Projekt verwenden, also 2D RB und 2D Collider. Benötigst du spezielle Kollisionsabfragen - wie z.B. ein Gegner kann einen anderen Gegner von hinten schlagen - könnte man auch darüber nachdenken, 3D RBs und 3D Collider zu verwenden. Man kann dies allerdings eben auch gut skripttechnisch lösen, von daher würde ich - auch der Performance wegen - erst einmal bei 2D bleiben.

Zu der Variante 2D ohne RB und Collider kann man auch wieder nur sagen, skripttechnisch kann man zwar alles irgendwie lösen, aber einfacher umzusetzen wäre es mit 2D RBs und 2D Collider, auch wenn das eventuell ein wenig Performance kostet.

Danke für die Rückmeldung. Ich würde ebenso gern beim 2D Projekt bleiben und 2D RB und 2D Collider nutzen.

Jedoch stelle ich mir die Frage, wie ich bei 2D Collidern, die Tiefe berücksichtigen kann. Über den Sortinglayer kann ich beispielsweise die SpriteRenderer sortieren, aber der Collider kollidiert - soweit ich mich richtig erinnere - mit allen anderen Collidern, die auf dem selben x-Punkt liegen.

 

vor 45 Minuten schrieb mikomi:

hey

ich habe schon öfters spiele gemacht mit little fighter als vorbild. grundsätzlich benutze ich dafür immer nur 2d rb und 2d collider. gravity brauche ich nicht bzw war bei mir nie sinnvoll. damit objekte hintereinander vorbeilaufen benutze ich die y position vom sprite und übertrage sie sinnvoll auf die z position (genauer gesagt auf die order in layer variable bei der sprite komponente)

springen habe ich bisher noch nicht realisiert, aber mit ein paar tricks ist das mit dem aufbau auch möglich

Beeinflusst die order in layer-Funktion ebenso den Collider?

 

Ich verstehe noch nicht ganz wie ich die 2D Collider "hintereinander" bekomme.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, ich glaube die Layer steuern nur die "Rendering Order" (welches Sprite zuerst dargestellt wird) des Spriteshaders. Den 2D-Collidern ist es auch egal, an welcher Z-Position sie sich befinden. Ich vermute, daß die 2D-Collider kollidieren werden, aber du kannst beispielsweise die Z-Position des Sprites prüfen und wenn diese "ausreichend" unterschiedlich ist die Kollision einfach ignorieren.
Probleme gibt es nur, wenn du eben zusätzlich 2D-Rigidbodies für physikalisch korrektes Verhalten verwenden möchtest. Das Einzige was mir dazu als Lösung einfällt, wäre eine Kollision von Sprites die sich auf verschiedenen "Z-Ebenen" befinden dynamisch (je nach Z-Position) zu unterbinden:
https://docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html

Dafür müsstest du dann ein Raster aufs Spielfeld legen und das Spielfeld in Z-Ebenen unterteilen. Alle Spielfiguren die sich dann auf unterschiedlichen Z-Ebenen befinden müssten sich dann untereinander ignorieren. Die Rastergröße ist dann quasi die "Dicke" deiner Spielfiguren. Man kann das ganze auch mit Layern machen aber dann wärst du auf maximal 32 Z-Ebenen beschränkt (könnte bei dem Bild vom Spiel oben sogar reichen).
Vielleicht kann Mikomi noch näher erläutern wie er es gemacht hat, das wären meine Ideen (oder du verwendest eben doch 3D Collider und 3D Rigidbodies).

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke nochmal für die Rückmeldung.

In etwa so habe ich mir das auch vorgestellt:

wenn der Character in die Tiefe geht, also nach oben werden y sowie z erhöht. Anhand der Z-Koordinate kann ich den order in layer setzen und y einfach für die position. dann werde ich ein 2d projekt mit 2d collidern nutzen, aber trigger collider. ich muss gleich mal im Manual nachschauen, ob sich trigger collider untereinander triggern, ansonsten ignoreCollision. gravity auf 0.

Danke für die Tipps. diese haben mir aufjeden weitergeholfen. falls ich nochmal fragen habe, melde ich mich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super Idee, dann muss man sich nur noch für das "Springen" was überlegen (wenn man das überhaupt implementieren möchte), also wenn 2 Spielfiguren auf der gleichen Höhe sind und eine die andere überspringen will. Aber hier kann man ja per Skripting Restriktionen ergänzen und das ist viel einfacher als meine beschriebene Methode (einen "vollen" Triggercollider auf jede Spielfigur setzen und bei einer Kollision den Sprung - über den RB - der Spielfigur manipulieren)

Und TobLine wollte noch fragen, ob er Sascha's Grafiken in seinem Spiel verwenden darf :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb Sascha:

Hmm... Warum machst du nicht einfach nur sehr flache Collider auf die Füße?

Jap, genau so hab ich es bisher immer gemacht ;)
Man muss das halt nur durchgehend durchziehen. Z.B. haben dann Energiebälle die über den Boden fliegen auch keinen Collider um das Sprite herum, sondern auch einen flachen Collider unter dem Sprite usw. 
Stell dir vor ein Licht von genau oben scheint auf dein Objekt, der "Schatten" der dabei entsteht auf dem Boden, ist dann der Collider.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 9 months later...

Hallo,

Lustigerweise hatte ich auch vor anhand eines Nachbaus des Lieblingsspiels meiner Jugend "Little Fighter 2" das Programmieren mit Unity ein wenig zu lernen. Leider stecke ich genau beim selben Problem fest. 

Ich habe ein 2D game erstellt und habe derzeit einen Charakter mit 2D-collider + 2D-RB, als Boden habe ich ebenfalls nen 2D-Box-Collider, so kann ich mich aber nicht in der Tiefe nach hinten bewegen.

Ist das in dieser Konstellation überhaupt möglich? Müsste ich mich dann nicht anstatt auf der z-Achse nach hinten zu bewegen, die Y-Achse Achse als Tiefe sehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hängt von der vorgetäuschten Perspektive ab. Man versucht ja einen 3D-Raum über eine 2D-Szene zu simulieren.

Wenn man in der 3D-Welt mit einer Kamera mit einem Winkel von 22.5 Grad von "oben herab" über die Szenerie schaut, dann ergibt sich die gewünschte Perspektive. Hier mal die Szenerie nachgestellt im Unity 3D-Raum.  Die 3D-Objekte wurde in Z verschoben (Tiefe) und ein wenig in X (Horizontal), um eine Bewegung zu simulieren. Die Y-Position ist über alle 3 Objekte gleich:

WZrGEs0.png

Wie man sieht wandern die Objekte in Y-Richtung nach oben und sie werden etwas kleiner. Um diesen Effekt in 2D nachzustellen sollte man - wie Mikomi oben bereits völlig korrekt beschrieben hat - die Sprites nach oben wandern lassen lassen (+Y) und zugleich die Z-Position (Z+) nach hinten verschieben. Je weiter ein Sprite nach oben wandert, desto weiter muss auch die Z-Position angepasst werden. Da der Sprite-Renderer die Z-Position beachtet, muss man nicht einmal Sorting-Layer oder "Order in Layer" anpassen.

Diese Szene besteht aus 3 Sprites mit einer Orthogonal-Kamera. Die Sprites wurden in Y und Z verschoben und die Größe wurde entsprechenden der Y-Position angepasst. Eine Perspektiv-Kamera würde auch funktionieren, ich denke hier kommt es aufs Spiel an (z.b. die verwendete "Parallax Scrolling"-Technik) welche Kamera man bevorzugt:

ZbJ2oDk.png

Nun zu den 2D-Collidern. Da die Collider die Z-Position des Spites einfach irgnorieren funktioniert die Kollision zwischen den Sprites ganz normal. Allerdings sollte man wie oben ebenfalls beschrieben den 2D-Collider entsprechend anpassen, damit Figuren aneinander vorbeilaufen können.

Was den "Boden" betrifft, da denke ich muss man umdenken, da der Boden ja nun eine "breite Fläche" ist und nicht wie bei einem normalen 2D-Jump& Run eine definierte "Kante" hat. Bei den RB2D sollte man die Gravitation deaktiveren und auch die Rotation einfrieren (siehe Constraints).

ZGw1ibY.pngfRYPsVF.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...