Jump to content
Unity Insider Forum

Elegantere Lösung für meine RTS Kamera


Alex88

Recommended Posts

Hallo zusammen,

 

ich arbeite im Moment an einer Echtzeit-Strategie-Spiel Kamera wie z.B. bei C&C. Im Moment stehe ich allerdings noch ganz am Anfang und versuche folgendes um zu setzen:

  1. Mit den Pfeiltasten oder WASD soll sich die Kamera vorwärts, rückwärts, links und rechts bewegen lassen.
  2. Bei gedrückter mittlerer Maustaste soll man die Kamera um sich selber drehen können.

 

Da die Kamera allerdings nicht gerade von oben auf das Geschehen drauf schaut, sonder im 30 Grad Winkel ist, fällt es mir etwas schwer, dass die Kamera sich nicht in Blickrichtung, sondern in die Drehrichtung bewegt.

 

Ich habe das ganze wie folgt gelöst und obwohl es zwar funktioniert, bin ich mit der Lösung noch nicht glücklich.

 

Habt ihr ein paar Tipps für mich?

 

function FixedUpdate()
{
  mainCamera.transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * scrollSpeed * Time.deltaTime);
  mainCamera.transform.position.y = 5;

  if (Input.GetButton("Fire3"))
  {
  //mainCamera.transform.eulerAngles.y += Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime;
  mainCamera.transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0, Space.World);
}
}

 

P.S. Welche Form ist bei der Rotation mit der mittleren Maustaste eleganter?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich mach das immer über Objekthierarchien.

Oberstes Objekt: ViewTarget (da schaut die Kamera hin, das Ding rollt über den Bode und wird um die Y-Achse gedreht)

Dadrunter: CameraParent (Sorgt für die Neigung der Kamera, dreht sich also um seine lokale X-Achse)

Und zum Schluss: Die Kamera (Wird auf dessen lokaler Z-Achse verschoben, um die Kamera weiter weg oder näher dran zu schieben)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey Sascha, danke für deine Hilfe, aber wirklich viel besser klingt deine Lösung leider auch nicht. :unsure: Ich habe den Script jetzt mal etwas verfeinert.

 

Jetzt muss noch eine Beschränkung beim Zoomen rein und dass die Kamera sich bei Berührungen des Bildschirmrandes bewegt. Mal gucken ob ich mich mit meiner Lösung doch noch irgendwie anfreunden kann. :huh:

 

function FixedUpdate()
{
var cameraHigh : float = mainCamera.transform.position.y; // Zwischenspeicher fuer die Kamerahoehe


mainCamera.transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * scrollSpeed * Time.deltaTime);
mainCamera.transform.position.y = cameraHigh;


if (Input.GetButton("Fire3"))
{
	mainCamera.transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0, Space.World);
}


if (Input.GetAxis("Mouse ScrollWheel"))
{
	mainCamera.transform.Translate(new Vector3(0, 0, Input.GetAxis("Mouse ScrollWheel")) * zoomSpeed * Time.deltaTime);

	cameraHigh = mainCamera.transform.position.y; // Neue Kamerahoehe zwischenspeichern
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich stören mich nur diese zwei Zeilen:

 

mainCamera.transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * scrollSpeed * Time.deltaTime);
mainCamera.transform.position.y = cameraHigh;

 

Ich setze die Bewegung der Kamera über transform.Translate um, muss dann aber quasi manuell die Kamerahöhe wieder zurücksetzen, da sich die Kamera sonst durch die 30 Grad Neigung nach unten bewegen würde. Das empfinde ich halt als unsauber.

 

Mit dem Rest bin ich eigentlich zufrieden. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du die Kamera mal auf 90° gedreht und geschaut, wie gut deine Zeile dann noch funkioniert? :)

 

 

Hau als letzten Parameter für Translate noch ein Space.World rein. Dann geht zwar die Drehung um die y-Achse erst einmal flöten, dafür kann man die Kamera relativ zur Welt, also unabhängig von der eigenen Neigung bewegen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...