Ich bin verwirrt über diese beiden Methoden im Unity-Framework. Beide bewirken, dass sich das Spielerobjekt bewegt, anhält, die Richtung ändert usw. Wann sollte eines über dem anderen verwendet werden und wann ist eines angemessen?
17
Antworten:
Sie können
velocity
das Objekt mit einer konstanten Geschwindigkeit bewegen (z. B. eine Kugel) undAddForce()
Bewegungen hinzufügen (z. B. ein Raumschiff-Triebwerk). Beachten Sie auch, dass es zwei "Arten" von Bewegungen gibt. Kraft und Impuls. Für ein Raumschiff-Triebwerk würden Sie Impuls verwenden.quelle
Obwohl es bereits eine akzeptierte Antwort gibt, denke ich, dass es einige zusätzliche Details gibt, die es wert sind, behandelt zu werden.
Velocity verwenden
Wenn Sie die Geschwindigkeit einstellen, setzen Sie absolut alles außer Kraft, was die Bewegung des Objekts beeinflussen könnte. In einigen Situationen ist dies wünschenswert, z. B. wenn Sie die Anfangsgeschwindigkeit einer Kugel einmalig einstellen, wenn sie abgefeuert wird, wie im Beispiel von Trojanfoe. Seien Sie nur vorsichtig, denn wenn es in den falschen Situationen verwendet wird, kann es Probleme verursachen:
Wenn mehrere Quellen / Skripte versuchen, die Geschwindigkeit desselben Rigidbody durch direktes Einstellen (dh
body.velocity = foo
) zu ändern , gewinnt derjenige, der zuletzt ausgeführt wurde, und die anderen haben keine Auswirkung. Dies kann dazu führen, dass Fehler in der Reihenfolge der Aktualisierung auftreten, was insbesondere dazu führt, dass Entitäten langsam schweben oder fallen (da die Abwärtsbeschleunigung aufgrund der Schwerkraft außer Kraft gesetzt wird, bevor sie sich ansammeln kann).Wenn Sie die Geschwindigkeit für jedes Bild einstellen, können Kollisionen mit anderen Objekten etwas seltsam sein. Es ist, als würde Ihr Objekt von einem Motor mit unbegrenztem Drehmoment angetrieben - unabhängig davon, wie viel Geschwindigkeit es beim Aufprall verliert, wird es beim nächsten physikalischen Schritt wieder auf Höchstgeschwindigkeit gebracht und seine Geschwindigkeit wird nicht vom Aufprall abgelenkt . Dies kann dazu führen, dass Objekte gestartet werden, mit denen Sie kollidieren, oder dass kleine Objekte in der Lage sind, große Objekte viel leichter zu schieben, als es den Anschein hat, oder dass Objekte langsam an statischen Barrieren entlang gleiten, anstatt sich von ihnen weg / entlang zu lenken.
Diese beiden Effekte können manchmal erwünscht sein. Wenn ich beispielsweise Kinect-Spiele mache und die Gliedmaßen des virtuellen Avatars des Spielers mit der Physikszene interagieren sollen, bewege ich diese Körper normalerweise mit der direkten Geschwindigkeitseinstellung. Da sich die tatsächliche Hand des Spielers an einem bekannten Ort befindet und die Kollision mit diesem virtuellen Objekt nicht verlangsamt wurde, muss die virtuelle Hand dasselbe tun, um in Ausrichtung zu bleiben. In diesem Fall möchten wir also alle anderen physikalischen Effekte überschreiben Bring es hin.
AddForce und Freunde
Im Gegensatz dazu arbeiten AddForce und ähnliche Hilfsfunktionen mit allen anderen Vorgängen in der Physik zusammen. Wenn mehrere Quellen / Skripte AddForce zu einem Rigidbody hinzugefügt werden, werden alle diese Effekte addiert, um eine Nettoveränderung in der Bewegung des Objekts zu erzeugen (die abhängig von der Berechnung auch unabhängig von der Reihenfolge sein kann). Auf diese Weise wird vermieden, dass ein Skript einen anderen Effekt der Physik vollständig unterdrückt.
AddForce gibt es in vier Varianten , indem Sie den optionalen ForceMode-Parameter angeben , der für verschiedene Dinge nützlich ist:
Wenn Sie versuchen, eine kontinuierliche Push-over-Zeit (z. B. etwas, das Sie bei jedem FixedUpdate anwenden) zu modellieren, wie z. B. ein Autofahren oder eine Rakete, die brennt, oder eine Schwerkraft, die gut zieht, möchten Sie Kraft oder Beschleunigung. (Abhängig davon, ob schwere Objekte langsamer beschleunigen sollen)
Wenn Sie eine plötzliche, scharfe Änderung der Bewegung modellieren, z. B. eine Kugel abfeuern, sich von einer Explosion zurückziehen oder von einer Barriere abprallen, möchten Sie mit größerer Wahrscheinlichkeit Impulse oder VelocityChange.
Die Verwendung von AddForce hilft Ihnen dabei, mehr physischen Realismus zu erreichen. Es kann jedoch auch erforderlich sein, dass Sie sich mehr mit der Physik Ihres Verhaltens befassen. Wenn Sie beispielsweise möchten, dass Ihr Körper eine endliche Beschleunigung bis zu einer Zielgeschwindigkeit aufweist, damit er realistischer auf Kollisionen reagiert, als wenn Sie die Geschwindigkeit in jedem Frame einstellen, möchten Sie wahrscheinlich eine Berechnung ähnlich der folgenden Hilfsfunktion:
Der Grund, warum ich all diese "Hilfsfunktionen" nenne, ist, dass Sie technisch gesehen alle dieselben Ziele erreichen können mit:
( Ich denke . Es ist möglich, dass Unitys PhysX / Box2D-basierte Physiklöser Änderungen über AddForce separat puffern, aber ich habe keine offensichtlichen Konsequenzen davon gesehen.)
Letztendlich erhalten wir also durch diese Funktionen wirklich klare Absichten . Wenn ich eine allmähliche Kraft anwenden möchte, muss ich nicht daran denken, mein deltaV mit Time.deltaTime zu multiplizieren und durch Masse zu dividieren. Ich möchte nur ForceMode.Force und es wird korrekt und konsistent gehandhabt. Und wenn ich oder jemand anderes später auf meinen Code zurückgreift, ist sofort klar, was ich meinte, ohne dass ich die Zeit- und Massenberechnungen entschlüsseln muss, um es herauszufinden.
quelle
Zusätzlich zu Trojanfoes Antwort Angry Birds vs Car Racing. Zwei wichtige und unterschiedliche Beispiele dieser Verfahren (
AddForce
undvelocity
jeweils). In Angry Birds ist die Verwendung der Geschwindigkeit beispielsweise etwas schwieriger, da Sie die Flugbahn des Projektils selbst festlegen müssten, wie z.Wenn ich AddForce in Angry Birds benutze, würde ich verwenden,
_birdRigidbody.AddForce(new Vector2(5,5));
Während, wenn ich Geschwindigkeit dann benutze, ich Flugbahn handhaben würde, die verwendet
x = v*t*Cos(theta) y = v*t*Sin(theta) - 0.5 * g * t *t
Oder sowas.
Während des Rennspiels müsstest du die Geschwindigkeit ständig kontrollieren, nicht wie bei Angry Birds, dh Shoot and all. In diesem Szenario ist das Handle
velocity
also nützlicher alsAddForce
.Ich hoffe du verstehst. Zumindest ein bisschen.
quelle
(Quelle)
quelle