Jump to content
Unity Insider Forum

Drag and Drop - Koordinaten stimmen nicht überein


Recommended Posts

Guten Morgen liebes Forum,

ich bin gerade dabei ein Lernspiel mit Unity zu programmieren. Dabei soll der Schüler einen Lückentext per Drag and Drop mit entsprechenden Wörtern füllen.

Das Problem ist, dass das Drag and Drop funktioniert, aber die Koordinaten falsch gesetzt werden. Ich erläutere einmal kurz den Aufbau:

Ich habe auf einem Canvas ein leeres GameObjekt, unter welchem alle UI-Elements als Childs enthalten sind. Es gibt normale Text-Elemente, Panels für die Lücken und Panels mit einem Text als Child für die "Lückenfüller". Wenn ich jetzt ein Textbaustein auf eine meiner Panel-Lücken ziehe, wird dieses genau über der Lücke eingefügt und nicht in die Lücke. Wenn ich versuche die Koordinaten der jeweiligen Elemente auszugeben, steht da auch, dass beide dieselben Koordinaten haben. Die Koordinaten die ausgegeben werden stimmen aber auch nicht mit den Koordinaten im Editor überein. Schon wenn ich die Koordinaten der Lücken in der Start Methode ausgeben lasse, sind dort andere Koordinaten, als ich im Editor stehen habe. ganz Merkwürdig :D 

image.png.2baecf74a768b826048f4fe109c7c474.png

image.png.b3d637dd13786f3384824c4093fa4727.png

Hier noch der Quelltext von dem Skript:

using UnityEngine;
using UnityEngine.EventSystems;

public class DraggableSlot : MonoBehaviour, IPointerEnterHandler
{
    void Start()
    {
        Debug.Log(gameObject.name + ": " + gameObject.transform.position); //ausgeben der Koordinaten stimmt nicht mit dem Editor überein
    }
    public void OnPointerEnter(PointerEventData eventData)
    {
        if(eventData.pointerDrag != null) //Wenn ich etwas über die Lücke ziehe und nicht einfach mit der Maus drüber gehe
        {
            eventData.pointerDrag.GetComponent<DraggableItem>().stopMoving(); //Sorge dafür, dass das Wort nicht mehr bewegt werden kann
            eventData.pointerDrag.transform.position = gameObject.transform.position; //"snappt" das Word auf das Panel
            //Die Positionen stimmen im Nachhinein laut den 2 nächsten Zeilen überein.
            Debug.Log("Drag: " + eventData.pointerDrag.transform.position);
            Debug.Log(gameObject.name + ": " + gameObject.transform.position);
        }   
    }
}

Auch Merkwürdig, dass wenn ich ein Wort zu der Lücke bewege, das Element so verrutscht, dass die obere linke Ecke auf meiner Maus drauf ist.

 

Die Gleichen Skripte verwende ich ebenfalls vorher, wo ich Bilder auf Panels drauf bewege, das klappt wunderbar. Liegt es an der Kombination von Panel und Text als Child?

 

Ich hoffe ihr könnt mir weiterhelfen. Viele Grüße

René 

Link to comment
Share on other sites

Willkommen!
Also:
Die Transform.position ist die Position, die ein Objekt in der Szene hat. Der genaue Punkt des Objektes ist aber abhängig von dem Pivot. Also dem Achsenmittelpunkt des Objektes. Dieser Pivot muss nicht zwangsläufig in der Mitte eines Objektes liegen.

Zur Transform.position gibt es auch noch die Transform.localPosition. Diese Position wird dir im Inspector angezeigt.
Wenn ein Objekt ein Vaterobjekt ist, also keinem anderen Objekt untergeordnet ist, dann ist die die localPosition das gleiche wie die position.
Ist das Objekt einem anderen Objekt untergeordnet, also ein Kind des Vaters, dann ist das nicht mehr das gleiche. die localPosition, die dir im Inspector angezeigt wird, bezieht sich jetzt auf den Vater. Wenn da also bei  XYZ 0,0,0 steht, dann hat das Kind die gleiche Position wie der Vater. Steht da 0,1,0 dann ist das Kind um 1 auf der Y-Achse zum Vater verschoben. Hätte der Vater die Position 10,2,0 dann hätte das Kind die Position 10,3,0 im Raum. Also bei Y 1 mehr und das ergibt die 3.

Ich sehe bei deinem Aufbau, dass deine Objekte verschachtelt sind. Es sind also alles Kinder vom Lückentext und einige dieser Kinder haben weitere Kinder. Die sind alsi für die weiteren Kinder der Vater.

Wenn du jetzt ein Objekt per Drag aufnimmst und bewegen willst, dann wird im Code wahrscheinlich das Objekt an die Maus geschoben, weil es beim verschieben die Mausposition als eigene Position übergeben bekommt und der Pivot der eigenen Position ist wohl die obere linke Ecke. Wenn du den Pivot nicht verschieben kannst (Was bei UI elementen eigentlich geht), dann musst du einen Offset einbauen. Also den Unterschied der Mausposition beim Klick zur Position des Wortobjektes beim Klick merken und bei der Bewegung immer mit einberechnen. Objektposition = mausposition + Offset.

Beim Ablegen übergibst du dem DragObjekt die Koordinaten der Lücke. Das ist eigentlich ok. Aber ich kann nicht sehen, ob deine Lücke vielleicht doppelt so hoch wie der Blaue bereich ist. Genauso kann es sein, dass dein Vaterobjekt oder irgend etwas anderes als Zielobjekt genutzt wird.

Du musst dir mal anschauen, wo deine Pivots liegen. EInfach das Objekt anklicken und im Inspector schauen, wo das Koodinaten-Kreuz angezeigt wird.
Vielleicht findest du da schon den Grund der falschen Position.

Link to comment
Share on other sites

Vielen Dank für die schnelle Antwort :)

Es hat geklappt. Ich habe den Pivot Punkt (wenn das so richtig formuliert ist) auf die Mitte des Elementes gesetzt (einmal beim Slot und einmal bei den Wörtern). Dann hat es geklappt :). Dann musste ich aber noch den Anchor nach Links setzen, damit sich die Elemente bei einer unterschiedlichen Smartphone-Höhe nicht merkwürdig verschoben werden. Ich habe immer in allen Situationen beide gleichzeitig gesetzt und nicht für beide etwas eigenes genommen xD. 

Ich habe auch sicherheitshalber die localPosition verwendet, da das für mich mehr Sinn macht.

Vielen Dank und viele Grüße

René

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...