Unity 3d spielfigur soll dem mauszeiger folgen?

1 Antwort

Heyho,

Das Problem ist, dass du nicht einfach die Mausposition mit der Transform-Position des Gameobjects vergleichen darfst. Die Mausposition wird in Pixel angegeben und die Transform-Position in units (1 Unit entspricht übrigens etwa 1 Meter in der Realität nur mal so am Rande^^). Wenn sich deine Maus also z.B. in der Mitte des Bildschirms befindet, liegen deine Mausposition-Werte schnell mal bei einigen hundert bis tausend (je nach Bildschirmauflösung und Fenstergröße). Deswegen bewegt sich dein Objekt direkt nach schräg oben, so lange bis es bei der Pixelanzahl angelangt ist.

Um das auszugleichen gibt es folgenden Befehl, der die Pixelanzahl auf dem Bildschirm in Units umrechnet. Dazu muss deine Kamera jedoch auf Orthographic eingestellt sein.

Vector2 mausposition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

Jetzt würde dein Objekt jedoch immer hin und her flackern, da du es ja jedes mal um eine ganze Einheit verschiebst. Angenommen du hast einen Maus x-Wert von 0.8 (bereits ins 3D Koordinatensystem umgerechnet) und das Objekt einen x-Wert von 0. Dann würde sich dein Objekt um 1 x-Wert verschieben, da der Maus-Wert ja größer ist als der Transform-Wert vom Objekt. In nächsten Frame wird wieder die Abfrage ausgeführt, jetzt ist Transform-Wert mit 1 größer als der von der Maus, sodass dein Objekt wieder um eine Einheit zurück bewegt wird. Dein Objekt springt also dauerhaft hin und her.

Das Problem wird durch diesen Code gelöst:

[SerializeField] float treshhold = 0.5f;

void Update()
{
Vector2 mouseIntoWorldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

if (mouseIntoWorldPosition.x > gameObject.transform.position.x + treshhold)
{
transform.Translate(1, 0, 0);
}
else if (mouseIntoWorldPosition.x < gameObject.transform.position.x - treshhold)
{
transform.Translate(-1, 0, 0);
}

if (mouseIntoWorldPosition.y > gameObject.transform.position.y + treshhold)
{
transform.Translate(0, 1, 0);
}
else if (mouseIntoWorldPosition.y < gameObject.transform.position.y - treshhold)
{
transform.Translate(0, -1, 0);
}
}

Jetzt bewegt sich dein Objekt immer in Ganzzahligen x und y-Werten abhänig von der Mausposition.

Wenn du gar nicht willst, dass sich dein Objekt nur in ganzen Einheiten bewegt (wie an einem Raster), sondern der Maus kontinuierlich folg, so kannst du auch einfach folgendes machen:

Vector2 mouseIntoWorldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

transform.position = new Vector3(mouseIntoWorldPosition.x, mouseIntoWorldPosition.y, 0);


PS: Den Anfangsbuchstaben von Variablen schreibt man am besten immer klein :)

Liebe Grüße,

Dosenbiiir


dezhen 
Fragesteller
 27.12.2016, 11:47

Vielen Dank für die ausführliche Antwort :)

0