Jump to content
Unity Insider Forum
Sign in to follow this  
Kunga

Realtime Strategy Camera (RTS) mit Kollision

Recommended Posts

Guten Abend die Herren und Damen,

 

ich habe bereits Google durchforstet und die Suchmaschine dieses Forums und ich habe gemerkt, Kollision und Kamera ist ein echt großes Thema. :D

Ich habe viele Vorschläge gefunden und Methoden, jedoch funktioniert nicht alles davon bei mir, deshalb brauche ich euren klugen Rat, damit meine Kamera optimal funktioniert.

Wie ihr dem Titel entnehmen könnt entwickle ich eine Realtime Strategy (RTS) Camera. Folgende Möglichkeiten sind vorhanden, um die Kamera zu bewegen:

 

zoomen:

  • Mausrad scrollen

rotieren:

  • rechts Maustaste gedrückt halten und nach links oder rechts bewegen

nach links:

  • linke Pfeiltaste
  • Taste "A"
  • Maus an den linken Bildschirmrand bewegen

nach oben:

  • oben Pfeiltaste
  • Taste "W"
  • Maus an den oberen Bildschirmrand bewegen

Für rechts und nach unten gilt das selbe, ich denke ihr habt das Konzept dahinter verstanden.

Vielleicht hilft noch die Information, dass meine Kamera mit einem Winkel von 45° nach unten blickt.

 

Aktuell habe ich das so gelöst, dass ich einen Raycast nach rechts, links, vorne und hinten caste und somit erlaube, ob man sich nach links und so weiter bewegen kann oder nicht. Hier ein kleines Codebeispiel, um es nachvollziehen zu können:

// C#-Snippet für Bewegung der Kamera
if (!Physics.Raycast (transform.position, Vector3.forward, 3f)) {
 if (Input.mousePosition.y > Screen.height - scrollZone || keyUp) {
 transform.Translate (moveForward * movementSpeed, Camera.main.transform);
 keyUp = false;
 }
}

// C#-Snippet für zoomen in die Welt
if (!Physics.Raycast (transform.position, Vector3.down, 1f)) {
 if (Input.GetAxis ("Mouse ScrollWheel") > 0) {
 transform.Translate (zoom * zoomSpeed, Camera.main.transform);
 }
}
if (Input.GetAxis ("Mouse ScrollWheel") < 0) {
 transform.Translate (-zoom * zoomSpeed, Camera.main.transform);
}

 

Das ganze ist leider nicht so sauber wie es ich möchte, da ich manchmal dennoch durch den Boden kann an bestimmten Hügeln auf der Welt und je nach Position durch die Wand gucken kann.

 

Jetzt zu meiner Frage:

Ist es sinnvoll bei meiner Kameraart mit Raycast zu arbeiten und sollte ich vielleicht noch Raycast zeichnen die diagonal laufen? Sprich nicht nur nach vorne, hinten, unten, oben, links und rechts, sondern noch diagonal nach rechts, links, vorne, hinten und so weiter. Ich hoffe ihr versteht was ich meine. :wacko:

Oder gibt es noch eine ganz andere Möglichkeit die sauber ist und meine Kamera nicht durch den Boden glitchen lässt, beispielweise mit Collidern oder so?

 

Sorry für den langen Post und die ganzen Fragen, aber wäre cool wenn mir jemand helfen kann.

 

Gruß, Kunga

 

-- EDIT | LÖSUNG GEFUNDEN --

Hey nochmal, ich habe eine Lösung gefunden, mit der ich aktuell sehr zufrieden bin. Dennoch würde ich mich sehr über Feedback freuen beziehungsweise bessere Methoden.

Ich überprüfe via Raycast ob etwas in der Nähe ist und wenn ja, bewege ich die Kamera nach oben. Bis jetzt konnte ich mich somit nicht durch den Boden oder durch die Wand glitchen. Für RTS Kameras ist das denke ich eine sehr gute Lösung. :)

// C#-Snippet
if (Physics.Raycast (transform.position, Vector3.left, raycastDistance) || Physics.Raycast (transform.position, Vector3.right, raycastDistance) ||
Physics.Raycast (transform.position, Vector3.forward, raycastDistance) || Physics.Raycast (transform.position, Vector3.back, raycastDistance)) {
 transform.Translate (Vector3.up, Space.World);
}

 

Edit 2: Okay, nach bisschen rumprobieren ist dieses Ergebnis doch nicht ganz optimal. Sie funktioniert zwar, aber nicht einwandfrei. :D

Share this post


Link to post
Share on other sites

Dein Ansatz klingt schonmal gar nicht so falsch.

 

Wenn du das mit Collidern machen willst musst du halt die Kamera auch mithilfe der Physik bewegen, das schließt dann auch wieder einen Rigidbody ein, was du ja vielleicht auch nicht wirklich willst, und eine Verschiebungsmethode (z.B. die velocity des Rigidbody's) die auch die Physik miteinschließt, was Transform.Translate nicht tut.

 

Ich würde an deiner Stelle, denke ich, einfach in die aktuelle Bewegungsrichtung einen Ray casten, der Rest scheint mir überflüssig, wenn du dich sowieso nicht in die Richtung bewegst. Der Vorteil ist dann natürlich auch das der Code kleiner bleibt :)

 

Dass du je nach Position durch Meshs schauen kannst lässt sich für dich wohl mit den Clipping Einstellungen der Kamera ändern.

  • Like 1

Share this post


Link to post
Share on other sites

Ich habe deine Art von Spiel noch nicht ganz verstanden, aber ich würde eine Art helper objekt erstellen, welches immer mitschwebt. Dieses überprüft dann in die jeweilige Richtung ob sich dort eine wand befindet oder nicht. Allerdings könnte es ja schieflaufen also dass der ray durch einen kleinen Freiraum durchläuft. Da könnte man dann hergehen und einen Hilfscollider an jedem prefab erstellen. Dieses ist dann einfach ein trigger und beeinflusst halt nichts am spielgeschehen. So würde ich es machen

  • Like 1

Share this post


Link to post
Share on other sites

Dein Ansatz klingt schonmal gar nicht so falsch.

 

Wenn du das mit Collidern machen willst musst du halt die Kamera auch mithilfe der Physik bewegen, das schließt dann auch wieder einen Rigidbody ein, was du ja vielleicht auch nicht wirklich willst, und eine Verschiebungsmethode (z.B. die velocity des Rigidbody's) die auch die Physik miteinschließt, was Transform.Translate nicht tut.

 

Ich würde an deiner Stelle, denke ich, einfach in die aktuelle Bewegungsrichtung einen Ray casten, der Rest scheint mir überflüssig, wenn du dich sowieso nicht in die Richtung bewegst. Der Vorteil ist dann natürlich auch das der Code kleiner bleibt :)

 

Dass du je nach Position durch Meshs schauen kannst lässt sich für dich wohl mit den Clipping Einstellungen der Kamera ändern.

 

Hey, danke für deine Idee! Hast ja total recht, lieber immer nur dorthin casten wohin ich mich auch bewege. Spart, wie du ja bereits sagst, ein bisschen Code und ich denke auch mal Performance. Ich werde das mal einbauen. :)

Ich weiß nur noch nicht genau was du mit "durch Meshs schauen" meinst und der "Clipping Einstellungen". Das werde ich mir auf jeden Fall mal anschauen gleich.

 

Ich habe deine Art von Spiel noch nicht ganz verstanden, aber ich würde eine Art helper objekt erstellen, welches immer mitschwebt. Dieses überprüft dann in die jeweilige Richtung ob sich dort eine wand befindet oder nicht. Allerdings könnte es ja schieflaufen also dass der ray durch einen kleinen Freiraum durchläuft. Da könnte man dann hergehen und einen Hilfscollider an jedem prefab erstellen. Dieses ist dann einfach ein trigger und beeinflusst halt nichts am spielgeschehen. So würde ich es machen

 

Deine Idee klingt auch ganz gut, danke dir. Wirklich interessant zu sehen welche Lösungswege verschiedene Benutzer gehen würden. Sollte ich mit der Idee von DieKuensteDesBosses nicht weit kommen, werde ich mal versuchen deine umzusetzen.

 

Natürlich freu ich mich noch auf weitere Ideen von anderen Benutzern, falls ihr welche haben solltet. :D

 

Gruß, Kunga

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×