2017-08-23 2 views
0

Ich habe eine Frage. Ich habe 4 Objekte auf dem Bildschirm und ein Projektil wie im Bild unten. image sourceGameObject transform.Rotate()

Wenn ich auf ein Objekt in dem Projektil 4 klicke, ändert sich die Position, die das Objekt anzeigt, auf das ich geklickt habe. Dies ist der verwendete Code, aber es funktioniert nicht.

public GameObject Tun; 
public GameObject[] robotColliders; 
public GameObject[] Robots; 

foreach(GameObject coll in robotColliders) 
    { 
     coll.GetOrAddComponent<MouseEventSystem>().MouseEvent += SetGeometricFigure; 
    } 

    private void SetGeometricFigure(GameObject target, MouseEventType type) 
{ 
    if(type == MouseEventType.CLICK) 
    { 
     Debug.Log("Clicked"); 
     int targetIndex = System.Array.IndexOf(robotColliders, target); 
     Tun.transform.DORotate(Robots[targetIndex].transform.position, 2f, RotateMode.FastBeyond360).SetEase(Ease.Linear); 
    } 
} 

Ich dachte über die Verwendung der Komponente DORotate() nach, aber es funktioniert sowieso nicht. Kann jemand dieses Problem beheben?

Antwort

1

Eine Methode wäre, eine Quaternion zu verwenden, um die Rotation um die z-Achse zu setzen, indem Sie einen Vektor zwischen dem Objekt und Ihrem Pfeil verwenden, um den Winkel zu erhalten.

Vector2 dir = Robots[targetIndex].transform.position - Tun.transform.position; 
Tun.transform.rotation = Quaternion.Euler(0, 0, Mathf.atan2(dir.y, dir.x)*Mathf.Rad2Deg - 90); // may not need to offset by 90 degrees here; 
+0

Ah, ja sicher, es funktioniert perfekt vielen Dank))) – George

0

Das sind viele bewegliche Teile für solch eine einfache Aufgabe. Unity Handbuch hat ein Beispiel, das die korrekte (sehr effizient) ist Weg, diese Art von Dingen zu tun (siehe https://docs.unity3d.com/ScriptReference/Mathf.Atan2.html):

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour { 
    public Transform target; 
    void Update() { 
     Vector3 relative = transform.InverseTransformPoint(target.position); 
     float angle = Mathf.Atan2(relative.x, relative.z) * Mathf.Rad2Deg; 
     transform.Rotate(0, angle, 0); 
    } 
} 

Diese betreiben, indem ein Objekt um die Y-Achse dreht (deshalb Atan2 Konten für X und Z): Wenn Sie eine andere Achse benötigen, passen Sie den Code einfach an, indem Sie diese ändern.

+0

nett .......))))) – George