Jump to content
Unity Insider Forum

Objekt im Kreis bewegen (Sin/Cos)


Darkkingdom

Recommended Posts

Hey Leute,

 

also folgendes:

Ich möchte ein 2D Objekt um meinen Player kreisen lassen.

Die Rotation soll an 4 Verschiedenen Punkten starten (oberhalb vom Player, links vom Player etc.).

Sobald die Collisionsfunktion sagt das etwas im Weg ist soll das Objekt den Uhrzeigersin wechseln.

Sodass es sich dann in die andere Richtung weiter dreht.

 

Bisher hab ich folgenden Code:

 

float radius = 3;
float angle =0;
float period = 2f;
float x;
float y;

public void MoveInCircle () {
 if (!setOnce) {
  setOnce = true;
  dir = stateMaster.shotDir;
 }

 if (CollisionScript ()) {
  if (clockwise) {
clockwise = false;
  } else {
clockwise = true;
  }
 }
  angle -= period*Time.deltaTime;
  switch (dir) {
 case 1:
  //starte unten
  x = Mathf.Sin(angle+Mathf.PI)*radius + player.transform.position.x;
  y = Mathf.Sin(angle+Mathf.PI/2)*radius + player.transform.position.y;
  break;
 case 2:
  //starte oben
  x = Mathf.Sin(angle)*radius + player.transform.position.x;
  y = Mathf.Sin(angle+Mathf.PI)*radius + player.transform.position.y;
  break;
 case 3:
  //starte links
  x = Mathf.Sin(angle+(Mathf.PI*1.5f))*radius + player.transform.position.x;
  y = Mathf.Sin(angle)*radius + player.transform.position.y;
  break;
 case 4:
  //starte rechts
  x = Mathf.Sin(angle+(Mathf.PI/2))*radius + player.transform.position.x;
  y = Mathf.Sin(angle+Mathf.PI)*radius + player.transform.position.y;
  break;
 }
  this.gameObject.transform.position = new Vector2 (x,y);
}

 

Allerdings komm ich so nicht weiter, da das CollisionScript ja jeder Zeit sagen kann wechsel den Uhrzeigersinn und so würde sich das Objekt ja wieder zu einem der Startpunkte porten.

 

Also fällt euch vielleicht eine Möglichkeit ein mit der ich mit Sin oder Cos jederzeit den Startpunkt ändern bzw. den Uhrzeigersin ändern kann? :)

 

 

Blöderweiße hatte ich selbst nie Sin oder Cos in der Schule :(

Jetzt merkt man erst wie sehr einem das fehlt^^

 

Alternativ dachte ich schon einfach an ein Vector2[] wo ich einfach mein GO von Index zu Index schicke aber damit wird die bewegung halt einfach nie so wirklich schön rund^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum so kompliziert, erstelle ein Center GO und erstelle dein rotierendes GO als Child vom Center GO, nur so weit entfernt wie dein Offset sein soll, dann rotiere dein Center GO (was du auf deinen player legen kannst) indem du einfach nur transform.rotation oder transform.eulerAngles jeden tick (Update) anpasst.

 

Pack einen Collider auf dein Objekt und setz ihn als Trigger wenn nötig und reagiere auf die Kollisions/Trigger Events um die Richtung zu wechseln die du im Update verwendest um transform.rotation oder transform.eulerAngles zu manipulieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jain, das Center GO bräuchte dann ein Script was in der LateUpdate() Methode sich selbst an die Position (nur Position) des Fakeparents setzt:

 

public Transform FakeParent;

void LateUpdate()
{
transform.position = FakeParent.position;
}

 

Edit: Du meinst wohl eher das rotierende Element soll sich nicht mitdrehen? Dann mach das hier in LateUpdate:

 

transform.rotation = Quaternion.identity;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jain, das Center GO bräuchte dann ein Script was in der LateUpdate() Methode sich selbst an die Position (nur Position) des Fakeparents setzt:

 

public Transform FakeParent;

void LateUpdate()
{
transform.position = FakeParent.position;
}

 

Edit: Du meinst wohl eher das rotierende Element soll sich nicht mitdrehen? Dann mach das hier in LateUpdate:

 

transform.rotation = Quaternion.identity;

 

Ja ich meinte das rotierende Element :)

Vielen vielen dank Mark für die super smoothe und einfache Lösung für Anfangs unglaublich kompliziertes Problem :)

Thumbs up und so^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mhhh jetzt hätte ich doch noch eine kleine Frage zu dem Thema.

Wenn der Spieler mit seinem rotierenden Objekt gegen zb. eine Wand läuft ist es möglich das er den Abstand zwischen Player und Rotationsobjekt verringert.

 

Dafür hab ich noch folgendesdazu geschrieben:

 

if(Vector2.Distance(rotateGO.transform.position,player.transform.position) != radius) {
Vector2 axis = rotateGO.transform.position - player.transform.position;
rotateGO.transform.Translate (new Vector3((axis.normalized.x * 5) * Time.deltaTime, (axis.normalized.x * 5) * Time.deltaTime,0));
  } else {
  //Rotiere das parentGO
  }

 

Das scheint zwar irgendwie zu funktionieren.

Aber leider neigt das rotateGO (das was sich um den player dreht) öfters zur teleportation zu neigen^^

Danach seit ihr mich aber erstmal los :)

 

 

EDIT:

=====

Hups sorry hätte auch einfach den letzten Post editieren können ^^"

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...