Jump to content
Unity Insider Forum

FPS Character Setup - Movement, Collider, etc?


Tiwaz

Recommended Posts

Moinsen,

ich bastel grade an einem First Person Shooter Tool Kit und überarbeite grade meinen alten MovementController, da ich neue Bewegungszustände und Haltungen einführe. So soll man sich jetzt zum Beispiel auch hinlegen oder nach links oder rechts lehnen können. 
Allerdings reicht dafür die Funktionalität des Unity CharacterControllers nicht aus, (den ich bisher dafür verwendet hab) da sich der soweit ich weiß nicht rotieren lässt und ich mich somit nicht hinlegen kann. Außer ich richte den CapsuleCollider auf die Z-Achse aus, statt Y aber dann wird der Hinlegeprozess saumäßig unpräzise, weil wann schalte ich das Alignment dann um? Das müsste über die komplette Hinlegeanimation interpoliert werden und das geht ja afaik nicht. Auch das Lehnen ist damit unmöglich, da komm ich um genaues Rotieren nicht drum rum.


Daraufhin hab ich mal versucht einen Rigidbody zu benutzen und ebenfalls einen CapsuleCollider zu geben, da ich den dann ja dann rotieren kann, wodurch sowohl das Hinlegen vernünfig funktionieren würde und ich mich auch Lehnen könnte. Allerdings bin ich mit einem simplen CapsuleCollider im Hinblick auf das Lehnen nicht ganz zufrieden. Ich finde die Umsetzung des Lehnens bei Battlefield 4 oder Arma 3 ziemlich gut und würde das gerne auch so einbauen nämlich, dass man nicht nur den Kopf und die Waffe rausstreckt, sondern man das Standbein auch mit vor die Deckung zieht. 
Und da bin ich grade ein bisschen überfragt wie man das gut umsetzen könnte - von den Collidern her, dass da auch ne ordentliche Hit-Detection möglich ist.
@edit2: ich könnte natürlich auch einfach die transform selber benutzen und das ganze in eine Art CustomCharacterController kapseln und den benutzen. Denn Rigidbodys finde ich extrem schlecht für Charaktere - Warum wahrscheinlich auch der CharacterController eingefügt wurde.. :D Ich denke das wäre tatsächlich sogar gar nicht mal so schlecht was das Movement betrifft, allerdings stehe ich dann trotzdem noch vor dem Collider-Problem:

@edit: ist glaube ich doch nicht so gut.
Zusätzlich zum CapsuleCollider einen BoxCollider für das Standbein einzubauen, der sich dann nur im Lehnen aktiviert? Finde ich persönlich irgendwie ein bisschen komisch, würde aber den Zweck wohl ganz gut erfüllen.  Oder komplett weg vom CapsuleCollider und ein Konstrukt aus BoxCollidern basteln, die den Charakter approximieren? MeshCollider? -> Wäre wahrscheinlich im Hinblick auf die Hit-Detection sehr präzise aber würde in größeren Multiplayer Modi die Performance richtig runter ziehen oder? @edit: größere Multiplayer Modi hätten für mich so um die 64 Spieler auf der Map, wobei ich natürlich auch nicht böse wär, wenn ich noch größer skalieren könnte.
Vor allem auch was Hit-Detection anbelangt bin ich mir da auch noch nicht so 100% schlüssig, ich hätte das bei dem CapsuleCollider wohl so gemacht, dass ich ihn logisch in verschiedene Areale unterteile und je nach hit.point eines Projektils o.ä. die Körperzone festgemacht, das wäre glaube ich nicht schwierig und wenig fehleranfällig. Bei mehreren BoxCollidern befürchte ich halt irgendwie, dass sich da eventuell (v.a. während Animationen? -> Da bin ich noch kompletter Noob) Abstände auftun, wodurch die Hit-Detection eventuell unzuverlässig wird, weil man dazwischen durch schießen könnte.
Man könnte dann natürlich auch wieder anfangen und die Areale wo sich BoxCollider treffen mit SphereCollidern o.ä. abdecken aber das wäre doch dann vom Setup her unnötig kompliziert oder?
Kommt mir zumindest unpraktikabel vor.

Was denkt ihr so, was da das beste System wäre? Bin auch offen für vollkommen andere Ansätze.
Würde mich auch über Tutorials oder ähnliches freuen, die mir weiterhelfen könnten ^^

Viele Grüße,
Tiwaz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurzes Update, ich denke das ist einen zweiten Post wert, v.a. um auch im Opening nicht zu viel zu editieren und weil das auch schon 2 Tage her ist. ^^

Ich hab mich jetzt auf einen Rigidbody festgelegt, da wie bereits beschrieben der CharacterController meiner Einschätzung/Ansicht nach nicht für meine Zwecke ausreicht (falls ich falsch liege kann man mich gerne korrigieren btw, ich schrecke auch nicht vor Refactoring zurück wenn es zu einem besseren Ergebnis führt) und das Movement direkt über die transform zu aufwändig wird was Kollisionen betrifft, da man ja dann nicht auf das Physiksystem zurückgreifen kann und Kollisionserkennung manuell handlen muss.

Momentan nehme ich auch noch den CapsuleCollider her und würde mich nach wie vor über jede Anregung bezüglich des Collider Setups eines Charakters freuen. 
Ich werde auf jeden Fall mal MeshCollider ausprobieren und zum einen mal schauen wie der Overhead da so ist und zum anderen wie präzise man damit arbeiten kann und ob der Overhead eventuell gerechtfertigt ist.

Außerdem hab ich mir mal ein Collider Setup für Beat 'em Up Spiele gesehen und ich muss sagen, die benutzen auch viele u.U. also da werden an jeden Joint Sphere- oder BoxCollider gepackt. Also ist so ein "komplexes" Setup wie ich im Eingangspost erwähnt habe vielleicht doch nicht so abwegig -> BoxCollider/CapsuleCollider für Gliedmaßen und SphereCollider an den Joints um die "Übergänge" abzudecken.
Vielleicht finde ich da ja noch Resourcen zu anderen Shootern wie Arma oder so wie das dort gemacht wird. BIn auch hier froh über jeden Tipp oder Material das jemand kennt :)

Viele Grüße,
Tiwaz

PS: Ich hab eingebaut, dass man sich ducken kann, wobei ich den CapsuleCollider kleiner mache (height verkleinere) aber dafür dicker (radius hoch), was dazu führt, dass der CapsuleCollider tiefer (oder weniger tief? weiß ich grade nicht mehr) in den Boden fällt bevor eine Collision erkannt wird bzw. er stehen bleibt. Der Unterschied ist ziemlich genau (aber nicht immer 100% exakt) die height / 10. Ist das schon mal jemandem aufgefallen und handelt es sich dabei um einen Bug oder ist das Verhalten normal? Und warum passiert das? 
Das passiert übrigens nicht wenn ich die height ändere, nur beim radius, was dazu führt, dass die Camera erst mal rumbounced, sieht doof aus.
Jetzt berechne ich halt die height / 10 noch mit in die Camera-Höhe ein jetzt gehts, aber ist trotzdem komisch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja ich sehe momentan immer mehr Nachteile in Rigidbodies.. Allerdings muss ich auch sagen, dass ich 0 Ahnung von Rigidbodies habe, weil ich die irgendwie nie benutze, die handeln mir zu viel und ich weiß nicht, wo ich was einstellen kann.
Zum Beispiel wenn ich einen Hügel rauflaufe und quasi oben angekommen bin, fliegt mein Charakter noch ewig weiter, das ist zwar für Fahrzeuge cool aber passt so überhaupt nicht zu einem Charakter. Und wenn ich irgendwo dagegen laufe fliegt mein Char auch immer ein bisschen in die Luft. Letzteres kann ich anscheinend mit dem Angular Drag anpassen, wobei ich auch keine Ahnung hab welcher Wert da sinnvoll wäre und ob das überhaupt der richtige Regler dafür ist.
Außerdem wenn ich an einem Abhang stehen bleibe rutsche ich langsam ab, das will ich auch nicht auf einem Charakter haben und habe kA wie ich das ausstellen kann. 

Kann man solche Sachen irgendwie noch einstellen oder würde es mehr Sinn machen tatsächlich einen CustomCharacterController zu bauen?
Und wie würdet ihr da so die Collision Detection machen? Raycasts? Kinematic Rigidbody + Collider?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde mal schätzen ein Controller mit RB macht doppelt so viel Arbeit wie den CC zu verwenden. Zudem bekommt man zusätzliche Probleme mit "Freiheitsgraden" die man nicht haben will, genau was du beschrieben hast, ein Rutschen, ein Bouncing, evtl. Drehungen die man nicht braucht etc. Man kann den RB in den Griff bekommen, aber dafür muss man ihn "knebeln". Rotation verbieten, physikalisches Material entsprechend einstellen (dynamic / static friction), ggf. die Bewegung des RBs überschreiben in bestimmten Situationen.
Beispielsweise hat der Controller von Opsive unterschiedliche Materialien für Laufen, Stehen und Treppen steigen definiert und alles solche Kleinigkeiten ...
Dein beschriebenes Problem bekommt man vermutlich mit einer Kraft in den Griff die den Charakter zusätzlich auf den Boden drückt ... Zumdem sollte man dem RB eine Masse geben, bspw. 80 .. entsprechende Materialien die beim Stehen des Chars aktiviert werden verhindern ein Abrutschen am Hang etc.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also wie im Eingangspost schon geschrieben kann ich den CC von Unity nicht benutzen, weil er einfach zu unflexibel ist, daher würde ich wohl einen eigenen CustomCC schreiben.
Aber wie du schon sagst müsste ich den Rigidbody wohl ziemlich knebeln, damit ich das gewünschte Verhalten kriegen würde. Das ist halt mega doof, weil ich den CC von Unity total gerne benutzen würde, der wäre eigentlich sehr gut für das Movement aber man müsste ihn halt rotieren können und das bricht mir in dem Fall das Genick dabei.

Hmmm... beziehungsweise.. wenn ich eine Weile so drüber nachdenke.. eigentlich nicht.. 

In meiner Denke musste der CapsuleCollider immer als Hitbox dienen bzw. der Collider den ich am Player hängen habe. Aber das muss ja überhaupt nicht so sein.
Ich kann ja den CapsuleCollider des built-in CharacterControllers auch einfach nur für normale Kollisionen beim Movement mit der Umwelt etc benutzen und für Angriffe eine komplexere Hitbox für Projektile etc aufbauen. Wäre das hier vielleicht sogar der beste Ansatz?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...