2016-08-01 15 views
0

So habe ich das folgende Problem: Ich habe eine Welt Raum Leinwand nach einem Pfeil, der sich um den Bildschirm bewegt. Die Leinwand selbst ist nur ein Kind des Pfeils. Das Problem ist, dass manchmal, wenn der Pfeil auf etwas am Rand des Bildschirms zeigt, Teile der Leinwand vom Bildschirm verschwinden. Ich möchte Code schreiben, der den gesamten Canvas jederzeit im Ansichtsfenster hält. Ich habe online eine Lösung gefunden, aber dadurch bleibt der Drehpunkt des Objekts innerhalb der Kameragrenzen und nicht das gesamte Objekt. Ich kann einfach nicht herausfinden, wie man das ganze Objekt innerhalb der Kameragrenzen hält. Hier ist der Code, ich habe:Behalten Sie ein Objekt (Welt-Raum-Leinwand) immer im Kamera-Ansichtsfenster

void LateUpdate() 
{ 
    transform.rotation = rotation;// This simply keeps the objects original rotation independant from the parent 
    Vector3 pos = Camera.main.WorldToViewportPoint(transform.position); 
    pos.x = Mathf.Clamp01(pos.x); 
    pos.y = Mathf.Clamp01(pos.y); 
    transform.position = Camera.main.ViewportToWorldPoint(pos); 
} 

Antwort

0

Sie könnten eine Art von Zeichen-Box um Ihre GameObject definieren und dann prüfen, ob alle Eckpunkte innerhalb des Ansichtsfenster sind (und wenn das Objekt nicht bewegen)

Zur Definition ein begrenzendes Rechteck können Sie entweder einen BoxCollider verwenden, der als Auslöser festgelegt ist (um zu verhindern, dass er mit seiner Umgebung kollidiert). Mit den Collidern Center und Size können Sie alle Eckpunkte bestimmen und diese für Ihre Schrankenprüfung verwenden.

Wenn Sie keine Collider verwenden möchten, können Sie eine einfache Klasse/Struktur schreiben, in der Sie die Mitte und die Ausdehnung einer imaginären Bounding Box definieren können (zB Gizmos, um sie im Editor zu zeichnen) groß ist es und wie es positioniert ist).

Hoffe, das hilft.

bearbeiten
Okay, wie Sie erwähnt haben Sie GetWorldCorners können die 3D-Eckpunkte abzurufen. Um zu überprüfen, ob sich diese im Ansichtsfenster befinden, transformieren Sie sie einfach unter Verwendung von Camera.main.WorldToViewportPoint und prüfen, ob ihre x- und y-Komponenten in [0, 1] sind. Wenn jetzt beispielsweise Ihre Leinwand auf der rechten Seite nicht mehr angezeigt wird, haben die zwei rechten Ecken einen x-Komponentenwert> 1, z. 1,5, was bedeutet, dass es um (-0.5, 0) (Ansichtsfensterkoordinaten) verschoben werden muss. Sie könnten jetzt versuchen, die Mitte der Leinwand in Ansichtsfenster-Koordinaten um (-0.5, 0) zu verschieben und den resultierenden Punkt in den Welt-Raum zu projizieren. Dieser projizierte Punkt wäre der Punkt, an dem sich die Mitte Ihrer Leinwand befinden sollte.

Wenn Sie genauer sein und wollen auch die 3D-Leinwand drehen, könnten Sie alle 4 Eckpunkte verschieben und zu transformieren und bewegen/drehen Sie die Leinwand entsprechend

+0

gut, da es ein RectTransform es ist ein Build es GetWorldCorners-Methode, um die 4 Ecken der Rect-Transformation zu erhalten. Was ich nicht herausfinden kann ist, wie man überprüft, ob sie sich im Ansichtsfenster befinden und wie man das Objekt danach bewegt. –

+0

@UriPopov Ich habe meine Antwort bearbeitet – TheDjentleman