2016-09-21 4 views
1

Unity3D unterstützt in den letzten Versionen native Multimonitor-Unterstützung. Die API-Dokumentation legt nahe, dass dies damit verbunden ist, jedes Display mit einer Kameraansicht zu verbinden. Ist es möglich, stattdessen eine Anzeige einer Szene zuzuordnen? Damit ein Benutzer mit zwei Monitoren zwei verschiedene Szenen auf einem der Monitore anzeigen kann? Wenn es möglich ist, wie würde man dies tun?Unity3D: Anzeigen verschiedener Szenen auf mehreren Monitoren

+0

Und Sie möchten diese zwei Szenen zur gleichen Zeit oder nur eine nach der anderen zeigen? – Programmer

+0

Zur gleichen Zeit. Mein spezielles Interesse ist es, einen Mod für das Kerbal Space Programm zu schreiben, um die neue Multimonitor-Unterstützung von Unity zu verwenden, damit Benutzer die Kartenansicht oder IVA-Ansichten auf sekundären Bildschirmen anzeigen können, während die Flugansicht auf dem Hauptbildschirm angezeigt wird. – silentcoder

Antwort

3

Verschiedene Szenen auf mehreren Monitoren anzeigen?

Nein, können Sie nicht.

Anzeigen verschiedener Kameras aus der gleichen Szene auf mehreren Monitoren?

Ja! mit der Display Klasse.

Tatsache ist, dass Sie nicht zwei verschiedene Szenen gleichzeitig ausführen können. Du kannst nicht.

Sie können jedoch Application.LoadLevelAdditive (veraltet) oder SceneManager.LoadScene("sceneName",LoadSceneMode.Additive); verwenden, um die aktuelle Szene zu erweitern, die nichts mit dem zu tun hat, was Sie fragen.

Was Sie tun können:

Position mehrere Kameras an verschiedenen Orten in die-gleiche Szene dann jede Kamera an verschiedene Display machen.

Das maximal unterstützte Display ist .

Sie können Display.displays.Length verwenden, um die Anzahl der angeschlossenen Anzeigen zu überprüfen.

Display.displays[0] ist die Haupt-/Primäranzeige.

Display.displays[1] Weiter Anzeige

Display.displays[2] Nächste Anzeige

Display.displays[3] Ein weiteres Next Display

Rufen Sie die Funktion aktivieren um die Anzeige zu aktivieren.

Display.displays[1].Activate(); 

Wenn Sie das Display aktivieren, können Sie auch die Breite, Höhe und Bildwiederholfrequenz angeben. (Für Windows nur)

int width, height, refreshRate; 
width = Screen.width; 
height = Screen.height; 
refreshRate = 120; 
Display.displays[1].Activate(width, height, refreshRate); 

Bevor Sie das Display aktivieren, stellen Sie sicher, dass die Anzeige Index auf eine Kamera einzustellen.

MyOtherCamera.targetDisplay = 1; // Lassen Sie MyOtherCamera auf dem zweiten Display anzeigen. Sie können jetzt die Funktion Aktivieren aufrufen.

Nehmen wir an, wir haben 4 Kameras und 4 Displays und möchten jede Kamera für jedes Display anzeigen.

Camera[] myCams = new Camera[4]; 
void Start() 
{ 
    //Get Main Camera 
    myCams[0] = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>(); 

    //Find All other Cameras 
    myCams[1] = GameObject.Find("Camera2").GetComponent<Camera>(); 
    myCams[2] = GameObject.Find("Camera3").GetComponent<Camera>(); 
    myCams[3] = GameObject.Find("Camera4").GetComponent<Camera>(); 

    //Call function when new display is connected 
    Display.onDisplaysUpdated += OnDisplaysUpdated; 

    //Map each Camera to a Display 
    mapCameraToDisplay(); 
} 

void mapCameraToDisplay() 
{ 
    //Loop over Connected Displays 
    for (int i = 0; i < Display.displays.Length; i++) 
    { 
     myCams[i].targetDisplay = i; //Set the Display in which to render the camera to 
     Display.displays[i].Activate(); //Enable the display 
    } 
} 

void OnDisplaysUpdated() 
{ 
    Debug.Log("New Display Connected. Show Display Option Menu...."); 
} 
+0

Ist es möglich, Anzeigen über die Zielanzeige in Kamerakomponenten zu aktivieren, die mit dem camer-Objekt verbunden sind? – Hamid

+1

Ich verstehe Ihre Frage wirklich nicht, aber Sie müssen dem Ziel der Kamera eine Anzeigenummer zuweisen ('Camera.targetDisplay') und dann' Display.display [index] .Activate() 'aufrufen, damit das Bild der Kamera auf dem angezeigt wird Monitor. Ich habe das alles in der Antwort besprochen. – Programmer

1

gleiche Lösung here:
Multi-Display

Multi-Display können Sie auf bis zu 8 verschiedenen Monitoren gleichzeitig zu 8 verschiedenen Kameraansichten Ihrer Anwendung zur Anzeige von bis ermöglicht. Sie können dies für PC-Spiele, Arcade-Spiele-Maschinen und einfache Installationen für die öffentliche Anzeige verwenden.

Multi-Display funktioniert nur im Standalone-Modus und wird unter Windows, Mac OS X und Linux unterstützt.

Previewing Multi-Display in Ihrem Projekt

die verschiedenen Monitoranzeigen zu sehen:

Set jede Kamera auf einen bestimmten Monitor angezeigt werden, dessen Inspektoren. Über die Option Zielanzeige können Sie zwischen 1 und 8 Monitore zuordnen (siehe Abb. 1).

Abb. 1: Kamera-Inspektor mit Zielanzeigeoption
enter image description here
Abb. 1: Kamera-Inspektor mit Zielanzeigeoption Sie können dann im Spiel Ansicht jedes Display eine Vorschau über das Drop-Down-Menü Anzeige in die obere linke Ecke der Ansicht (siehe Abb. 2).

Bild 2: Display-Vorschau in der oberen linken Ecke des Spiels anzeigen
enter image description here
Bild 2: Display-Vorschau in der oberen linken Ecke des Spiels anzeigen aktivieren Multi-Display

Die Standardanzeige Da es sich um einen Monitor handelt, müssen Sie beim Ausführen Ihrer Anwendung alle zusätzlichen Anzeigen mithilfe von Display.Activate explizit per Skript aktivieren. Sie müssen jede zusätzliche Anzeige explizit aktivieren und nach dem Aktivieren können Sie sie nicht mehr deaktivieren.

Die beste Zeit zum Aktivieren zusätzlicher Anzeigen ist beim Erstellen einer neuen Szene. Ein guter Weg, dies zu tun, ist eine Skriptkomponente an die Standard-Kamera anzuhängen. Stellen Sie sicher, dass Sie Display.Activate nur einmal während des Starts aufrufen. Es kann hilfreich sein, eine kleine Anfangsszene zu erstellen, um sie zu testen.

Beispiel Skript

using UnityEngine; 
using System.Collections; 

public class DisplayScript : MonoBehaviour 
{ 
    // Use this for initialization 
    void Start() 
    { 
     Debug.Log("displays connected: " + Display.displays.Length); 
     // Display.displays[0] is the primary, default display and is always ON. 
     // Check if additional displays are available and activate each. 
     if (Display.displays.Length > 1) 
      Display.displays[1].Activate(); 
     if (Display.displays.Length > 2) 
      Display.displays[2].Activate(); 
     ... 
    } 
    // Update is called once per frame 
    void Update() 
    { 

    } 
} 

API-Unterstützung

Folgende UnityEngine.Display API-Funktionen unterstützt:

public void Activate() 

Dies aktiviert eine spezifische Anzeige auf der Breite des Strommonitor und Höhe . Dieser Aufruf muss einmal beim Starten einer neuen Szene erfolgen. Es kann von einem Benutzerskript aufgerufen werden, das an eine Kamera oder ein Dummy-GameObject in einer neuen Szene angehängt ist.

public void Activate(int width, int height, int refreshRate) 

Nur Windows: Dies aktiviert eine bestimmte Anzeige auf der Breite und Höhe eines benutzerdefinierten Monitors.

1

Zusätzlich zu den anderen Antworten, wenn Sie wirklich eine andere Szene auf einem anderen Monitor anzeigen möchten, können Sie sicherstellen, dass alles in diesen Szenen auf einer bestimmten Ebene ist. Stellen Sie dann in der Kamera in dieser Szene die Cullingmaske so ein, dass nur diese Ebene gerendert wird, und schließen Sie diese Schicht auf Ihrer Hauptkamera aus. Dann laden Sie die Szene additiv wie bereits erwähnt.

Dies ist im Grunde, wie Unity Vorschau auch funktioniert (obwohl anstelle einer Szene ein verstecktes Prefab instanziiert).

Verwandte Themen