2017-12-13 4 views
1

In Unity3D habe ich ein Spielobjekt, das mit einem Box Collider und physischem Material verbunden ist. Das Hand-Controller-Modell ist ebenfalls an einem Box-Collider und einem Physikalischen Material angebracht. Wenn das Spielobjekt mit der Handsteuerung kollidiert, meldet sich CollideWithController an der Konsole an. Das Spielobjekt ändert jedoch nicht die Richtung.Objektwechselrichtung nach Kollision mit Controller

if (other.CompareTag("HandController")) 
{ 
    Debug.Log("CollideWithController"); 
    var magnitude = 1000; 
    var force = transform.position - other.transform.position; 
    force.Normalize(); 
    gameObject.GetComponent<Rigidbody>().AddForce(force * magnitude); 
} 
+0

Bitte senden Sie Ihren Code als tatsächliche Code, nicht als Screenshot. Informationen zur Formatierung finden Sie in der [Markdown-Bearbeitungshilfe] (https://stackoverflow.com/editing-help). – Nyerguds

Antwort

0

Ohne zu sehen/zu wissen, was other ist, zu sagen seine schwer zu, aber im Allgemeinen könnte es zwei Probleme:

  1. transform.position-other.transform.position führt nicht tatsächlich in der Richtung, die Sie erwarten. Um dies zu ermitteln, drucken Sie den Wert oder zeigen Sie ihn unter Debug.DrawRay an.
  2. Die Kraft, die du hinzufügst, reicht möglicherweise nicht aus, um die Richtung zu ändern, oder andere Kräfte heben dies auf.
+0

"Andere" bezieht sich auf den Handcontroller, mit dem der Controller interagieren soll. Ich habe versucht, die Kraft zu ändern, aber immer noch kein Ergebnis. Tatsächlich wurde mir klar, dass ich keine neue Richtung für das Spielobjekt festgelegt habe, zu dem ich mich bewegen könnte? Entschuldigung, ich bin ziemlich neu in der Programmierung, also war dieser Code der, auf den ich von anderen verwiesen habe. – Zhipeng

0
var force = transform.position - other.transform.position; 

Sie ein Richtungsvektor erhalten andere von dieser in die Position zu bekommen. Sie bewegen sich also in die Kollision, die Umkehrung des Vektors sollte Ihr Problem beheben.

+0

Was meinst du damit, den Vektor umzukehren? ist es var force = other.transform.position - transform.position? Ich habe versucht, diesen Vektor umzukehren, aber das Objekt ändert immer noch nicht die Richtung? – Zhipeng

+0

Mit der Umkehrung meine ich multiplizieren mit -1 nach oder bevor Sie es normalisieren. – MustSeeMelons

0

Wenn Sie den Wert der Physik wie hier mit AddForce ändern, sollten Sie dies im FixedUpdate tun, um das Fehlerrisiko zu minimieren. (Es kann außerhalb des FixedUpdate funktionieren, aber in den meisten Fällen wird es unerwünschtes Verhalten erzeugen).

In Ihrem Code verwenden Sie AddFroce, aber wenn die tatsächliche Kraft des gameObject größer als das ist, wird die Kraft, die Sie hinzufügen, nur die tatsächliche Bewegung des Spielobjekts verlangsamen und es nicht umkehren.

Ich denke, der beste Weg, um die Bewegung Ihres gameObject zu ändern ist, den Geschwindigkeitsvektor zu verwenden und es zu reflektieren.

Ein weiterer Tipp: Verwenden Sie keine Physik für Gameplay-System. Physik ist etwas sehr Kraftvolles, sie kann viel emergentes Verhalten mit sich bringen, aber es ist ein chaotisches System. Und wenn es um Gameplay geht, willst du kein Chaos, du willst Kontrolle und Konsistenz.

Unity doc: