Jump to content
Unity Insider Forum

Rigidbody für bullet / explosion aktivieren und deaktivieren


fancymovies

Recommended Posts

Idealfall:

Bullet schlägt auf einen kinematic obj mit collider auf und macht alle objekte inkl. dem getroffenen obj in einem gewissen Explosionsradius zu non-kinematic objs.

Nach einer gewissen Zeit werden die non-kinematics wieder zu kinematics, so sie noch existieren.

Sinn der Übung: Ich möchte mit ner Rakete ein fractured Objekt beschießen oder mit nem Panzer da durchfahren - ABER es soll nicht alles bei der kleinsten Berührung umfallen.

Aber: Es soll auch nix "in der Luft stehen bleiben", was ja passiert, wenn alles kinematic is.

Ich habs schon geschafft, Zeug, das auf den Boden fällt mit Triggeren kinematisch zu machen. Dummerweise kam es dann zu sehr komischen Ergebnissen, wenn ein NPC drauf starb. Und die Zerstörungen waren auch so nicht so dolle. Besonders weil ich dann immernoch das Problem hatte, dass die non-kines bei der kleinsten Berührung runterfielen - was etwas komisch aussah, bei eigentlich massiven Wänden.

Hat wer ein paar Tips, wie ich mein Problem lösen könnte ?

Danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du denn schon mal mit der Masse deiner RBs gespielt?
Je höher die Masse ist, desto weniger lassen sie sich von anderen physikalischen Dingen bewegen. Das gilt für andere RB's wie auch irgendwelchen Forces.
Die Masse hat auf die Shcwerkraft keinen Einfluss. Egal wie hoch die Masse ist, der RB fällt immer gleichschnell zu Boden.
Außerdem kannst du allen Collidern noch physikalische Materialien geben um Reibungen zu erhöhen oder zu verringern. So richtig gut wirkt das zwar erst mit kinematischen RB's, aber dann haste wieder das Problem mit der Schwerkraft.


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich verstehe nicht, warum du überhaupt eine Umwandlung von kinematic auf non-kinematic machst (d.h. warum ist es nicht gleich non-kinematic). Kinematic würde ich nur im Einzelfall verwenden, aber auf jeden Fall nicht bei Objekten die statisch sind und sich nicht bewegen. 
Zu dem anderem Problem, ich würde das getroffene Objekte nur dann zerteilen, wenn das Projektil mit einer gewissen Beschleunigung auf das getroffene Objekt einschlägt, ist es unterhalb des Grenzwertes, bleibt das Objekte erhalten und es wird ggf. nur Kraft auf den RB des Objektes übertragen. 
Als Beispiel:
- ein Projektil trifft auf ein Fass, ist der Beschleunigungsvektor < 1 (velocity.magnitude), dann wackelt das Fass nur leicht, da der RB des Projektil's Kraft auf den RB des Fasses überträgt
- ist  der Beschleunigungsvektor > 1, dann wird das Fass zerteilt und die Bruchstücke des Fasses werden instanziiert (RB's non-kinematic + useGravity).

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie

Wenn es sooo einfach wäre übers Gewicht, hätte ich das in meinen gefühlten 1000 Tests gemacht.

Leider scheint das Gewicht in meinem Fall überhaupt nix zu nützen. Drag macht auch alles nur schlimmer.

Trotzdem danke.

 

@Zer0Cool

Warum ich das so machen will ?

Weil sonst das Zeug rumschwebt, in der Luft. Und das kann ich nicht ausstehen.

Das sieht man aber überall. Die "Schützen" Ballern von ner Wand von unten nach oben alles weg und dann schwebt das Dach  dumm rum.

Ich hab das Problem, dass entweder:

* Alles sofort in die Luft fliegt

* Nix in die Luft fliegt und nur das getroffene runterfällt + alles andere sonst rumschwebt

* Das Getroffene in die Luft fliegt und der Rest bei kleinster Berührung runterfällt

und noch n paar andere besch. Fälle.

 

Dein Vector is aber ein Ansatz - allerdings dürfte dann erst wieder alles rumschweben, wenn unten das Zeug wegballerst. Muss ich aber erst noch testen.

Mein Problm is ja nicht die Zerstörung, sondern die Umgebung der Zerstörung - bzw. was tut das Zeug, was NICHT zerstört wurde. Es darf nicht zuviel und nicht zuwenig runterfallen - und isses runtergefallen, darf es nicht wie von jedem npc weggeschoben werden können wie Smarties.

Sinn der Übung is ja:

Ich will mit nem Panzer durch ein Haus durchfahren können und mit ner Rakete nur Teile des Hauses in die Luft sprengen können.

Ganze Sachen in die Luft jagen, is ja überhaupt kein Problem. Das Problem is der Rest des Schlachtfeldes, wo Granaten, Raketen, Partikel, Trümmer und Npcs rumballern, rumfliegen, rumliegen und rumlaufen

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

und isses runtergefallen, darf es nicht wie von jedem npc weggeschoben werden können wie Smarties

Und genau deswegen müssen die Objekte eine hohe Masse haben! Wenn du das Ganze physikalisch aufbaust, also ein Player eine Masse von 80 hat und ein Dachelement eine Masse vom 500, dann schiebt da kein Player! Den Dragwert wegen dem Schieben zu erhöhen ist doof, denn er wirkt sich auch auf die Beschleunigung beim Fallen aus (wenn ich mich nicht irre). Stattdessen den RB's und Collidern schöne reibende Materialien verpassen. Ganz so, wie es in echt wäre.

Glaub mir, ich habe mit meinem Flipperprojekt viele Erfahrungen mit der Physik sammeln können und rede das nicht einfach so daher.

Du kannst natürlich immer noch den Ansatz mit dem umschalten auf Kinematik und nonKinematik weiterführen. Du musst aber eben irgendwie vor der Explosion allen Objekten, die da zusammenhängen, übermitteln, dass sie jetzt nonKinematik werden müssen. Also musst in dem FixedUpdate, bei dem das Prjektil auf ein Teilobjekt auftrifft, sich das Teilsück umschalten und auch allen seinen Nachbarn, die zusammenhängend das Gebäude bilden, das mitteilen. Damit das geht, muss zu Beginn des Spiels jedes Teilobjekt seinen Nachbarn und die Nachbarn seiner Nachbarn kennen. Also braucht jedes Objekt ein Script mit einem Array oder einer Liste seiner Nachbarn. In dem Script ist dann eine Funktion, die die Kinematic Eigenschaft ausschaltet und von mir aus einen Timer startet. Diese Funktion der anderen Objekte spricht das getroffene Teilstück an.
Der Timer der dann bei allen Objekten gestartet wird, gibt die Zeit an, wann frühestens wieder zurück geschaltet werden soll. Zusätzlich fragt sich jedes Objekt, ob denn noch eine Velocity vorhanden ist und solang das so ist, weil da vielicht ein Objket noch rutscht, wird gewartet. Erst wenn die Velocity ungefähr bei 0 ist, wird das Objekt selbst wieder zum Kinematic RB.

Nachdem also das System auf nonKinematic umgeschaltet wurde, also erst im nächsten FixedUpdate, führst du die Explosionsforce aus. Jetzt sollten alle betroffenen Objekte auf die Explosion reagieren und auch alle anderen Beteiligten würden mitspielen.

 In deinem Szenario existiert also nur das Problem, dass alle Nachbarn sich vor dem Ereignis umschalten müssen, denn gleichzeitig geht es nicht.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Projektile, die mit Rigidbodys modelliert sind, sind in meinen Augen nur dann sinnvoll, wenn sie beim Aufprall explodieren. Entweder das, oder das weggeschoben werden ist so gewollt. Bei allem darüber hinaus fängt es an, unsinnvoll zu werden, Rigidbodys zu benutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sehe immer noch keinen Grund, warum dein Gebäude aus kinematic RBs bestehen muss. Entweder dein Gebäude ist von Anfang an ein Gebäude das aus mehreren non-kinematic RB und Collidern besteht (die einfachste Lösung), oder (wegen der Performance) dein Gebäude besteht einfach aus mehreren statischen Meshes mit Triggern und diese wandeln bei  einer Kollision die getroffenen Teile des Gebäudes in Meshteile mit non-kinematic RB und Collidern um. Der anspruchsvolle Teil ist dann noch, nach der Umwandlung die Kräfte auf die neu erzeugten Gebäudeteile korrekt zu übertragen oder die Umwandlung findet statt, kurz bevor z.b. der Panzer in die Nähe der entsprechenden Gebäudeteile kommt (Trigger). Bei einem Projektil würde man die Umwandlung beim Einschlag des Projektils stattfinden und danach würde man eine Explosionsforce am Einschlagspunkt erzeugen.
Alle non-kinematic RB sollten dabei eine Masse haben die einem Gebäude entsprechen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...