Jump to content
Unity Insider Forum

2D Kameragrenzen abhängig von Zoom


Shaitan1805

Recommended Posts

Hey Leute,

 

ich arbeite aktuell an einem 2D-Game. Nun stehe ich vor einem Problem, an dem ich mich momentan schon viel zu lange aufhalte.

 

Ich habe eine orthografische Kamera in meiner Szene, welche der Spieler bewegen kann. Per

Pinch-to-zoom kann man auch das Sichtfeld beeinflussen, was in dem Fall über das Verändern des Wertes "orthographicSize" geschieht.

 

Soweit so gut. Nun zum Problem. Ich möchte, dass die Kamera nur bis zu bestimmten Grenzen bewegt werden kann.

 

post-4829-0-67681200-1465336550_thumb.jpg

 

Klar => Mathf.Clamp. Aber ich komm einfach nicht drauf, die Grenzwerte dynamisch zu berechnen.

 

Je nach Kamerazoom sind die Werte anders. Zudem sind die Level unterschiedlich groß, aber immer ein Rechteck.

 

Zusammenfassend suche ich also eine Möglichkeit die Grenzwerte abhängig von Levelgröße und Zoom zu berechnen.

 

Kann mir da jemand helfen?

 

Vielen Dank schonmal

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also die Orthographic Size hat ja über eine sehr einfache Formel Einfluss auf das Blickfeld.

Die Höhe des Blickfeldes ist orthographicSize * 2. Die Breite richtet sich nach dem Seitenverhältnis, also Höhe * aspect.

Bei einem 16:9-Bild und einer Orthographic Size von 5 deckst du also mit der Kamera eine Fläche ab von 17,77 * 10.

Per Code kann man das so ermitteln:

Vector2 GetFOV()
{
 var height = cam.orthographicSize * 2;
 var width = height * cam.aspect;
 return new Vector2(width, height);
}

Jetzt kannst du die Höhe und Breite deiner Spielszene z.B. mit einem GameObject einstellen, das ein solches Skript hat:

public class LevelBorder : MonoBehaviour
{
 public static LevelBorder singleton;
 public Vector2 size = new Vector2(10, 10);

 void Awake()
 {
singleton = this;
 }

 public Rect GetBorder()
 {
var pos = transform.position;
return new Rect(pos, size);
 }

 void OnDrawGizmos()
 {
Gizmos.color = Color.red;

var pos = transform.position;
pos.z = 0;

Gizmos.DrawWireCube(pos, size);
 }
}

Mit OnDrawGizmos wird der Rahmen im Editor sichtbar gemacht.

 

Deine Kamera kann jetzt nach jeder Bewegung folgendes tun:

var border = LevelBorder.singleton.GetBorder();
var halfFOV = GetFOV() / 2;
border.xMin += halfFOV.x;
border.yMin += halfFOV.y;
border.xMax -= halfFOV.x;
border.yMax -= halfFOV.y;
//An dieser Stelle enthält Border den Levelrand,
//der an jeder Kante um das halbe Sichtfeld der Kamera kleiner gemacht wurde.
//Jetzt muss die Kameraposition nur noch in die Box geclampt werden
var pos = transform.position;
pos.x = Mathf.Clamp(pos.x, rect.xMin, rect.xMax);
pos.y = Mathf.Clamp(pos.y, rect.yMin, rect.yMax);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für Deine schnelle Antwort und entschuldige bitte meine verspätete. Habe momentan viel um die Ohren.

 

Unser Team hat sich jetzt entschieden mit den Kamerascript noch zu warten, da es andere Prioritäten gibt. Daher hab ich Deine sachen noch nicht getestet, werde es aber noch tun.

 

Vielen Dank nochmals

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...