Jump to content
Unity Insider Forum

Objekt werfen.


PM_Daniel

Recommended Posts

HeyHo Leute!

 

Ich hab hier grad ein Problem und komm irgendwie nicht auf die Lösung...

 

Beschreibung:

Ich hab ein Objekt das ich mit der Maus aufhebe und welches so lange an der Maus hängt, wie die Maustaste gedrückt ist.

Wenn ich los lasse wird das Objekt in eine Richtung geworfen.

Das Objekt bekommt beim los lassen ein "AddForce",

welcher sich wie folgt ergibt:

Aktuelle MausPos - alte MausePos.

 

 

 

Die alte MausPos muss ja irgendwie definiert werden.

Das mach ich gerade noch über Update.

Dort wird alle x Sekunden die Aktuelle MausPos als alte MausPos gespeichert.

 

Nun mein Problem:

Die "AddForce" ist nun stark davon abhängig wann das letzte mal geupdatet wurde.

Was bedeutet, wenn ich im gleichen Frame oder eben nur 1-2 Frames nach dem Update werfe, bewegt sich das Objekt nur minimal.

Werfe ich aber 1-2 Frames vor dem Update, geht das Teil ab wie Schmids-Katze...

 

Mein Grundgedanke zur Lösung wäre nun in einem Zeitrahmen von z.B.: 1 Sekunde jeden Frame die MausPos abzufragen und in eine Variable zu stecken (Bsp.: Vector2 MausPos[]), dann beim loslassen der Maustaste den ältesten Wert nehmen und das als alte MauPos nehmen.

 

Nur leider bekomm ich das gerade nicht hin. :(

 

Habt ihr vielleicht ne bessere Idee, oder könnt mir da weiter helfen?

 

Vielen Dank schon mal!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soll die Bewegung der Maus auch für die Wurfstärke genutzt werden?

Wenn nicht, dann arbeite nicht mit Addforce sondern gib dem Objekt einfach eine Volocity in die gewünschte Richtung.

Die alteMausposition ermittelst du einmalig beim Klicken des Körpers und die neueMausposition beim loslassen.

Über die beiden Positionen kannst du ja deine Rictung ermitteln.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal Danke für die schnellen Antworten. :)

 

Ja die Bewegung der Maus bestimmt die Wurfstärke.

 

Um es etwas genauer zu erläutern:

 

Man hat am unteren Ende des Bildschirms eine Zauberleiste.

Aus dieser zieht man den Zauber ( Felsbrocken ) welchen man dann auf die Gegner schmeißt.

 

Btw.: Es ist ein 2D Spiel, also genügt eigentlich Vector2.

 

Dem entsprechend ist es also nicht möglich bei MouseDown die Pos zu speichern. sie müsste schon zeitabhängig sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Felsen "hängt" an der Maus und du willst ihn dann herumschleudern und irgendwann loslassen mit der entsprechenden Geschwindigkeit?

 

Ich würde dazu bei jedem Update die Mausposition bestimmen und die Geschwindigkeit zwischen der Mausposition vom letztem Update und aktueller Position bestimmen. Diese errechnete Geschwindigkeit würde ich dem Felsen beim Loslassen mitgeben.

 

Wenn du mehrere Werte mitteln willst, kannst du dann ja 20 oder 30 Geschwindigkeiten in einem Array mitführen und dann das Mittel errechnen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Cast.jpg

 

Dann entsteht aber ein Problem.

Wenn ich die MausPos. bei MouseDown nehme wird immer (Blaue Pfeile) von der Zauberleiste aus die Richtung und Kraft berechnet.

 

Ich möchte aber das ich auch (rote Pfeile) von oben nach unten, oder von links nach rechts etc. werfen kann.

 

Hinzu kommt das so ja nicht meine Geschwindigkeit den "Schwung" aus macht, sondern nur die Entfernung zur Zauberleiste.

Auch das ist nicht gewollt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde dazu bei jedem Update die Mausposition bestimmen und die Geschwindigkeit zwischen der Mausposition vom letztem Update und aktueller Position bestimmen. Diese errechnete Geschwindigkeit würde ich dem Felsen beim Loslassen mitgeben.

 

Du meinst also ich sollte in jedem Update so zu sagen die Kraft "Force" berechnen in dem ich die Distanz zum vorherigen Wert berechne?

 

Klingt vernünftig... Ich teste da mal was.

Werde euch informieren wenn ich ne Lösung hab, oder eben nicht. :D

 

Danke schon mal!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habs jetzt hinbekommen und es geht sehr gut so. :)

 

Danke nochmal.

 


   void OldMousePos()
   {
    if (_oldPosCounter < 20)
    {
	    _forceA[_oldPosCounter] = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));
	    _oldPosCounter++;
    }
    else
    {
	    _oldPosCounter = 0;
	    _forceA[_oldPosCounter] = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));
    }
   }
void Update()
{
if (_cast)
{
   OldMousePos();
}
if (Input.GetMouseButtonUp(0) && _cast)
{
for (int i = 0; i < _forceA.Length; i++)
{
  _force += _forceA[i];
}
_force = _force/_forceA.Length;
_force = _mPos - _force;
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...