Jump to content
Unity Insider Forum

C#: KI - Weltraum Shooter - Probleme mit Rotation


Tiwaz

Recommended Posts

Moin moin,

 

Das Script tut so weit eigentlich alles wie es soll, aber irgendwie funktioniert das mit dem sich drehen noch nich so 100%ig wie ich das will..

 

Kurz was ich genau erreichen möchte:

 

Das Gegnerraumschiff soll sich an der Y-Achse nicht so schnell drehen können wie an der X-Achse. Sprich man soll das Schiff nicht so schnell nach links und rechts drehen können wie nach oben und unten.

 

 

Meine Rotationsmethode sieht so aus

 

private void rotateToDirection(Vector3 targetDirection)
{
// Sorgt für eine X- und Y-Rotation
	transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target.transform.position - transform.position), rotationSpeed * Time.deltaTime);

// Sorgt dafür, dass sich das Raumschiff in Z-Achse zum Zielobjekt rotiert und sich ausrichtet
	var cross = Vector3.Cross(transform.forward, targetDirection);  
	if (cross.y < 0)
	{
		transform.Rotate(0, 0, aiTiltSpeed);
	}
	if(cross.y > 0){
		transform.Rotate(0, 0, -aiTiltSpeed);
	}
}

 

Damit habe ich aber eben 2 Probleme.

Zum einen wird die Rotation immer langsamer, während es sich zu der Zielposition dreht.

Ein paar Grad bevor der Gegner auf das Ziel schaut rotiert er so langsam, dass es noch ca. 1-2 Sekunden bis er in den Winkel kommt um schießen zu dürfen.

 

Das andere ist, dass die Rotation in X- und Y- Achse gleich schnell sind, was ich ja beeinflussen können will..

 

Hat jemand eine Idee wie ich die beiden Probleme hier lösen kann?

Link zu diesem Kommentar
Auf anderen Seiten teilen

mach bitte

 

[ CODE] ccccccccccc [/ CODE]

 

ohne leerzeichen ;)

 

private void rotateToDirection(Vector3 targetDirection)
{
// Sorgt für eine X- und Y-Rotation
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target.transform.position - transform.position), rotationSpeed * Time.deltaTime);
// Sorgt dafür, dass sich das Raumschiff in Z-Achse zum Zielobjekt rotiert und sich ausrichtet
var cross = Vector3.Cross(transform.forward, targetDirection);
if (cross.y < 0)
{
transform.Rotate(0, 0, aiTiltSpeed);
}
if(cross.y > 0){
transform.Rotate(0, 0, -aiTiltSpeed);
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hat niemand ne Idee? :wacko:

 

Ich hab auf unitygems.com in einer "Quaternion Einführung" gelesen, dass man eine konstante Rotation mit Mathf.SmoothDamp erzielen könnte, samt Anwendungsbeispiel.

habs dann einfach mal ausprobiert und sowas geschrieben wie:

 

[font=Consolas,]
 var newRotation = Quaternion.LookRotation(target.fixedPosition - transform.position).eulerAngles;[/font][font=Consolas,]
 var angles = transform.rotation.eulerAngles;[/font][font=Consolas,]
 transform.rotation = Quaternion.Euler(Mathf.SmoothDampAngle(angles.x, newRotation.x,(...)), Mathf.SmoothDampAngle(angles.y, newRotation.y,(...)),[/font][font=Consolas,]
		Mathf.SmoothDampAngle(angles.z, newRotation.z,(...));[/font]

 

Allerdings funktioniert dann gar nichts mehr im 3D Raum und ich krieg völlig chaotische Rotationen

Das Beispiel war auch nur auf 1 Achse beschränkt.

 

Das wär momentan das letzte Problem das ich bei meiner KI hab soweit

Kann nur noch nicht den exakten Vorhaltepunkt bestimmen lassen aber das Schiff dreht sich einfach viel zu langsam bei so spitzen Winkeln und die Berechnungen nachprüfen zu können.

 

Hab mir schon eine kleine Abhilfe gebastelt und lass die KI durch LookAt rotieren sobald sie in einen Winkel von 5° kommt aber sobald ich raus fliege muss sie sich auch erst mal ewig drehen bis sie in die 5° kommt..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...