Jump to content
Unity Insider Forum

UI Denksportaufgabe


Kojote

Recommended Posts

Grüße!

Ich bastel immer noch an meinem Brettspiel. Hier ist es möglich Charaktere auf das Spielfeld zu setzen. Dieses sind immer Positiv-X, Negativ-X, Positiv-Z oder Negativ-Z. Eine andere Ausrichtung gibt es nicht. Im UI habe ich "Karten" der Charaktere, die auf das Spielfeld gesetzt werden sollen. Derzeit schauen sie alle ebenfalls in diese Richtungen, damit der Spieler weiß in welche Richtung sie sehen. Was mir jetzt erst einfällt, wenn ich die Kamera drehe, stimmen die Blickrichtungen auf den Kartene nicht mehr mit Blickrichtungen auf dem Spielbrett überein. Ich häng mal zwei Bilder an um dies zu verdeutlichen.

Habt ihr eine Idee wie ich dieses Problem lösen könnte? Ich müsste ja dann die Grafiken des UI immer der Ausrichtung der Kamera anpassen, was denk ich recht kompliziert umzusetzen wäre.

Grüße von Kojote

1869a4-1532074997.jpg

9a6397-1532075013.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Grundsätzlich musst du dir Gedanken machen, wie der Spieler gesteuert werden soll. Ich hatte bei "Prince of Persia" Teil ? schon sehr früh aufgehört zu spielen, weil ich zum einen als 3th Person Game den Charakter gesteuert habe und bei anderen Aufgaben eher eine Steuerung eines Jump and Run hatte. Hier wollte ich immer noch mich bewegen wie als 3th Person. Das gleiche Problem hatte ich bei "Star Wars: The Force Unleathed". Auch dort gabe es Kämpfe bei denen die normale Steuerung für eine andere Steuerung getauscht wurde - frustrierend.

Es stellt sich für mich die Frage, ob du dich immer relativ zur Kamera, oder dich relativ zum Charakter bewegen willst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Stelle mir das jetzt nicht all zu schwierig vor. Die Rotation der Kamera ist ja bekannt, da kannst du ja deren Wert um die Y Achse verwenden. Dein Character ist ja ein 3d Modell, das könntest du ja ziemlich einfach duplizieren, dessen Rotation and die der Kamera anpassen und das ganze per render to Texture auf die UI übertragen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja die Bilder in diesem kleinen Kästchen müssen realtiv zu den Koordinaten -X +X -Z +Z angezeigt werden, am besten wäre es, wenn sich die kleinen Männchen auf den Karten bei einer Kamerabewegung mitdrehen würden. Das würde jedoch mit Sprites nicht funktionieren, dass müssten dann 3D Modelle sein und hier wüsste ich nicht, wie ich sie an ein UI anhänge, da dieses Menü auch auf dem Bildschirm verschiebbar ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber eben, das 3d Modell ist ja vorhanden, da müsstest du ja nichts neues machen und per render to Texture kann man das doch auf die UI bringen, oder verstehe ich dich falsch?

https://unity3d.com/de/learn/tutorials/topics/graphics/render-textures-and-ui

Wenn du das mit Sprites lösen möchtest, kannst du doch auch die Sprites austauschen je nach Rotation der Kamera?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Denk mal Render to Textur wäre schon die beste Idee. Müsste nur überlegen wie ich es anstelle. Die Charaktere sind in einer "Black Box" unter der Spielfläche in einer Warteposition bis sie auf das Spielfeld gesetzt werden. Überlege mir gerade wie ich da unten die Charaktere rendere. Mit der Hauptkamera wäre dies nicht möglich. Alternativ müsste ich 6 Nebenkameras machen, was wieder ganz schön Performance verbrauchen würde. Zudem, ich würde immer alles mit der Kamera aufnehmen, also nicht nur den Charakter.

Mehrere Spries wären auch möglich, aber da könnte ich entweder die Sprites aller 90° wechseln oder mit abständen. Das wäre aber auch nur eine sehr ungünstige Lösung. Zudem wird das auch wieder eine ganz schöna Abfragerei.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 59 Minuten schrieb Kojote:

6 Nebenkameras machen, was wieder ganz schön Performance verbrauchen würde. Zudem, ich würde immer alles mit der Kamera aufnehmen, also nicht nur den Charakter.

4 wüden ja ausreichen? 90 Grad um den Char herum. Das kann auch um den gerade aktiven Character sein, einfach den Character in ein separates Layer packen und den 4 Cams sagen sie sollen nur dieses Layer rendern und die MainCam kann ja weiterhin alles rendern.

Edit:
Darf ich mal fragen wie genau das den gedacht ist mit der Steuerung? Du könntest ja z.B. auch einfach 4 Pfeile um den Character herum machen die man dann anklikt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es sind aber bis zu 6 Charaktere auf der Spielfläche, von daher bräuchte jeder eine eigene.

OK stimmt, müsste man ma ausprobieren, in wie weit die Kameras dann Performance saugen.

Also hätten wir da zwei möglichkeiten:

1. Mit Sprites und aller 45,25° ein neues Laden. Wäre Scripttechnisch recht aufwendig, da ja die Startbilder immer in eine andere Richtung schauen und ich dann aufwendig umrechnen muss, welches Bild als nächstes dran wäre.

2. Render Kamera, 6 Stück und mit Layern versehen. Vom Scripttechnischen her am wenigsten aufwendig und ich könnte es recht einfach in das bisherige Script implementieren. Schau ich mir dann mal an, was der Resourcenunterschied ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Minuten schrieb Kojote:

Es sind aber bis zu 6 Charaktere auf der Spielfläche, von daher bräuchte jeder eine eigene.

Achso, und entsprechend werden immer alle im UI angezeigt, nicht nur die Figur die gerade bewegt/ bzw. am Zug ist?

1. Denke ist eher der Auwand die ganzen Sprites zu machen und den Überblick zu behalten. Vom Script her wäre man ja mit 4 Abfragen dabei (<0<90<180<270). Könnte man auch für alle Chars das gleiche anwenden und einfach die Sprites entsprechend reinsetzen.

2.Ja wie das Performance technisch aussieht weiss ich leider nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

Achso, und entsprechend werden immer alle im UI angezeigt, nicht nur die Figur die gerade bewegt/ bzw. am Zug ist?

Es werden alle angezeigt die nicht auf dem Spielfeld oder tod sind.

Zitat

Denke ist eher der Auwand die ganzen Sprites zu machen und den Überblick zu behalten. Vom Script her wäre man ja mit 4 Abfragen dabei (<0<90<180<270). Könnte man auch für alle Chars das gleiche anwenden und einfach die Sprites entsprechend reinsetzen. 

Stimmt, da wäre das einzige da nicht durcheinander zu kommen. Und das ist das Problem.^^" Obwohl nunja ganz so einfach ist es nicht der erste Char hat Rotation 0, nächste Drehung wäre 90. Zweiter Char wäre Rotation 90, nächste Drehung wäre 180. Das muss man ja auch mit abfragen.

Zitat

Ja wie das Performance technisch aussieht weiss ich leider nicht.

Habs gerade mal probiert. 6 Kameras alle auf Minimaleinstellung. Einzig, in den Blackbox müsste ich für Licht sorgen. Bisher merkt man es Performancemässig nicht, da ich aber nen sehr leistungsstarken Rechner habe, kann ich nicht von mir auf andere schließen.

EDIT: Habs gerade mal auf nem alten Laptop von mir getestet, also etwas mehr an Resourcen frisst er schon, denke ich werde mal die Spritvariante ausprobieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nicht so ganz, ich mach morgen mal nen Video. Ich hab mir nun mal beide Varianten vorgenommen, einmal als Sprite, hab ich aber aufgegeben, da das Scripten ins Chaos ausartete. Dann hab ich mal die Kameraversion probiert. Zwear Scripttechnisch sehr einfach umzusetzen, aber auch nicht gerade toll, ich hab zwar die Kameras auf Minimaleinstellungen gestellt, jedoch kostet mich jede Kamera knapp 20 Drawcalls. Bei 6 Kameras macht das 120 Drawcalls. Meine Scene hat an sich um die 100 - 120 DC, mit 6 Kameras wäre ich schon bei 250 DC. Wenn ich noch mal 3 Charaktere rein nehmen würde, wäre ich schon bei 310 DC.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meinte mal gelesen zu haben für Mobile liegt so die Grenze bei 100-200 drawcalls und bei PC 1000-2000 drawcalls je nach Rechner. Spielen natürlich auch andere Faktoren wie Polycount und Script-Performance eine Rolle, sowie Texturauflösung, echtzeit Licht und Schatten, Reflextionen, Global Illuminatin usw.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Würde ich auch meinen, vorallem am Anfang bei der Entwicklung wenn du noch nicht genau weisst wo die Reise hin geht. Performance ist eine Sache die man eigentlich macht wenn das Spiel soweit ist wie es sein soll, dann kannst du dir gedanken machen wie man was Batchen kann oder wo man was Baken kann. Dazu gibts auch jede menge Tuts z.B. auf YT. Natürlich wenn man von Anfang an drauf achtet, hat man später weniger Arbeit.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin schon am Ende der Reise, dass sind gerade letzte Korrekturen. ^^

Sag mal kannst du mir verraten wie viel Batches gut sind?

Was mir jetzt einfällt, ich könnte die Kamera auch nur dann anschalten, wenn die Kamera gedreht wird, so würde ich auch DCs sparen, zumindest zeitweise.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke am einfachsten gebe ich dir gleich das Package, dann siehst du auch wo was ist.

Ist jetzt alles Sprite basiert. Den MSAdvancedCameraController Ordner kannst du ignorieren, ist nur ein gratis orbit Kamera controller Asset.

Mit gedrückter rechten Maustaste kannst du die Kamera rotieren, mit Pfeiltaste links/rechts kannst du den Player drehen.
Mit dem Wert Offset kannst du die Blickrichtung ändern, wenn du z.B. die Blickrichtung von Hinten statt von Vorne haben möchtest, ist aber im Script beschrieben.

Ob das Script was taugt garantiere ich natürlich nicht, wie immer gilt: viele Wege führen nach Rom.

 

Edit:
https://www.dropbox.com/s/2k6jqqsojm42wpn/SpriteUI2.unitypackage?dl=0

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...