Winkel zwischen zwei Punkten

9

Ich habe einen Charakter, der zu zufälligen Punkten in meinem Zimmer in Unity geht. Das Problem ist, dass er immer in eine Richtung zeigt. Ich möchte in C # einen Code schreiben, der die Richtung, in die das Zeichen gerade zeigt, und die Position des Ziels ermittelt und dann den Winkel zwischen ihnen berechnet, um das Zeichen um diesen Betrag zu drehen. Ich habe die LookAtFunktion ausprobiert , aber dadurch läuft der Charakter in einer Bogenform auf das Ziel zu, was sehr unnatürlich aussieht, da er ständig auf das Ziel schaut.

Darren
quelle
4
Ich kann jetzt keine richtige Antwort schreiben, aber Sie brauchen einen grundlegenden Trigger. Google Polarkoordinaten und atan2.
JCora

Antworten:

10

Die LookAt-Funktion erledigt dies für Sie. Möglicherweise verwenden Sie es nicht ordnungsgemäß oder es stimmt etwas nicht mit Ihrer Lenkung, wenn Sie Probleme damit haben. Sie können es auch so versuchen:

//find the vector pointing from our position to the target
dir = (Target.position - transform.position).normalized;

//create the rotation to look at the target
rotation = Quaternion.LookRotation(dir);

Jetzt können Sie entweder in Richtung dieser Drehung einrasten oder dies im Laufe der Zeit langsam tun. (Langsam im Laufe der Zeit bedeutet, dass der gesamte Code in die Aktualisierungsfunktion aufgenommen werden muss.)

//rotate over time
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * RotationSpeed);

//snap rotation
transform.rotation = rotation;

Für 2D wäre eine andere alternative Methode Atan2 :

angleBetween = Mathf.Atan2(point2Y - point1Y, point2X - point1X) * 180 / Math.PI))
MichaelHouse
quelle
void FixedUpdate () {// aktuelle Lenkrichtung abrufen, um die Zielposition zu erreichen Vector3 walk = (this.mTargetPosition - this.transform.position) .normalized; // ignoriere 3d walk.y = 0.0f; walk.Normalize (); // in die gewünschte Richtung bewegen this.transform.LookAt (mTargetPosition); this.transform.Translate (-walk); }} Auf diese Weise habe ich die Lookat-Funktion so eingerichtet, wie sie ist. Ich kann nicht sagen, was daran falsch ist, außer ich gehe davon aus, dass sie möglicherweise nicht in fixedUpdate enthalten sein sollte.
Darren
Ich bin mir nicht sicher. Was macht es? Wenn ich an der Lenkung arbeite, habe ich überall Debug-Linien gezogen. Ich habe Linien, die die Richtung zeigen, in die Goblins zeigen, Beschleunigungslinien und Geschwindigkeitslinien. Stellen Sie sie alle auf verschiedene Farben ein, damit Sie wissen, welche welche ist. Dies hilft wirklich beim visuellen Debuggen. Es lässt Sie wissen, welches nicht richtig aussieht, und Sie können dann mehr darüber nachdenken.
MichaelHouse