Unity 3d spielfigur soll dem mauszeiger folgen?
Erstmal einen wunderschönen abend, ich kriege es leider nicht hin, dass auf unity die Spielfigur meiner Maus richtig folgt. Ich wollte eigentlich die position der Maus ausmachen diese dann mit der position der Spielfigur vergleichen und diese dann je nachdem in welche richtung sie muss dann in diese bewegen. Jedoch streift die spielfigur nur einmal diagonal nach oben links ab.
Vector2 Mausposition = Input.mousePosition;
if (Mausposition.x > gameObject.transform.position.x)
{
transform.Translate(1, 0, 0);
}
else if (Mausposition.x < gameObject.transform.position.x)
{
transform.Translate(-1, 0, 0);
}
if (Mausposition.y > gameObject.transform.position.y)
{
transform.Translate(0,1, 0);
}
else if (Mausposition.y < gameObject.transform.position.y)
{
transform.Translate(0,-1, 0);
}
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
Vielen Dank für die ausführliche Antwort :)