Jump to content
Unity Insider Forum

Addforce zu lokalen Koordinaten


LonlonFarm1

Recommended Posts

Moin,

Ich hab ein kleines Problem, ich dachte eigentlich dass es einfach wird, aber ich irrte. Also, ich programmiere zurzeit ein 2d Plattformer in dem man Schusswaffen haben kann, ich möchte dass man in jede Richtung schießen kann, was ich auch hinbekommen habe. Allerdings möchte ich einen streu-Effekt bei der Schrotflinte haben. Als mein Charakter nur nach vorn und hinten schießen konnte war es einfach:Beispiel für mach rechts schießen bullet.AddForce(new Vector2(1, UnityEngine.Random.Range(-0.5, 0.5)) * schusskraft) Hoffentlich ist es verständlich ich hab das jetzt aus dem Kopf geschrieben.

jetzt ist mein Problem dass ich die Random Streuung nicht mehr über y laufen lassen kann, da sie sobald man nach oben zielt ja über x laufen müsste.

also hab ich am Ende des Waffenlaufs ein empty object platziert das ja immer die selben lokalen Koordinaten hat egal wie die Waffe sich dreht, der waffenlauf ist bei Dem Sprite links also müsste ich ja die force einfach immer so zufügen dass sie nach links geht mit zufälligen Abweichungen nach unten und oben.

das ist mein Problem, die force scheint immer in Welt Koordinaten zu funktionieren und schießt daher immer einfach nach links von Charakter 

ich probierte auch bereits addRelativeForce was auch nicht funktioniert hat, vielleicht verstehe ich die relative force auch einfach nicht richtig.

ich hoffe jemand hat eine Idee wie er mir helfen kann oder kann mir die relative force so erklären dass es funktioniert 

der lange Text tut mir leid, ich wollte nur alles So gut wie möglich erklären.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

vor 13 Minuten schrieb LonlonFarm1:

der lange Text tut mir leid, ich wollte nur alles So gut wie möglich erklären.

Mach dir da mal keine Sorgen. Ich bin bei weitem nicht der einzige, der eine vernünftige Problembeschreibung einem Zweizeiler vorzieht, bei dem man noch 70% durch Raten rausfinden muss, bevor man weiß, was eigentlich los ist :)

Also... AddForce ist in der Tat in Weltkoordinaten. AddRelativeForce ist im lokalen Raum. Heißt: Wenn du dein Objekt so ausrichtest, dass die Nase nach oben zeigt und dann AddRelativeForce mit Vorwärts-Vektor benutzt, dann fliegt das Objekt nach "vorne" aus der eigenen Sicht - also nach oben.

Du könntest also dein Objekt irgendwie ausrichten und dann einfach AddRelativeForce nach vorne machen. Du kannst aber auch ein bisschen Mathematik auf deinen Richtungsvektor draufschmeißen. Die wohl simpelste Methode wäre ein kleiner Vector2, der obendrauf gerechnet wird:

var gunDirection = transform.right; // So als Beispiel - das wäre die Richtung, in die die Waffe gerade genau zielt
var spread = Random.insideUnitCircle * 0.3f;

bullet.AddForce((gunDirection + spread).normalized * force, ForceMode.Impulse);

Sollte funktionieren, ist aber evtl. etwas schwer zu kontrollieren Durch die Verteilung der Zufallsvektoren innerhalb eines Kreises hast du eine wesentlich höhere Chance auf eine geringe Abweichung, und nach außen wird's weniger wahrscheinlich. Aber ist ja evtl. auch nicht so ganz schlecht. Die Skala dafür ist aber auch etwas komisch. Wenn du mit 0.6f multiplizierst anstatt mit 0.3f, dann hast du nicht doppelt so viel Streuung, sondern etwas weniger. Ist vielleicht nicht so intuitiv zu editieren.

Du kannst auch eine Rotation bauen und diese draufmultiplizieren:

var gunDirection = transform.right; // So als Beispiel - das wäre die Richtung, in die die Waffe gerade genau zielt
var spread = Quaternion.Euler(Random.Range(-20, 20), 0, 0);

bullet.AddForce(spred * gunDirection * force, ForceMode.Impulse);

Hier kannst du schön intuitiv -20° bis +20° oder eben alles andere einstellen. Die Wahrscheinlichkeit ist für alle möglichen Winkel gleich hoch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wow, danke für die tolle Antwort! :D

 

ich hätte nicht gedacht so schnell eine so gute, hilfreiche und sogar komplett verständliche Antwort zu bekommen.

In einem Forum ist Dankbarkeit sehr schwer auszudrücken, aber sie ist auf jedenfall bei 100%, an der Antwort ist echt nichts auszusetzen, einfach perfekt :)

 

falls es hier noch irgendwas gibt wo man eine gute Antwort markieren kann, was ich noch nicht tat, sag einfach Bescheid , ich kenne mich hier noch nicht so gut aus :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...