Unity3D: Displaying different scenes on multiple monitors

silentcoder picture silentcoder · Sep 21, 2016 · Viewed 15.3k times · Source

Unity3D has native multimonitor support in recent versions. The API documentation suggests that this is tied to connecting each display to a camera view. Is it possible to, instead, map a display to a scene ? So that a user with two monitors could have two different scenes each displayed on one of the monitors ? If it is possible, how would one go about doing this ?

Answer

Programmer picture Programmer · Sep 21, 2016

Display different scenes on multiple monitors?

No, you can't.

Display different cameras from the-same scene on multiple monitors?

Yes! with the Display class.

The fact is that you cannot run two different scenes at the-same time. You cannot.

However, you can use Application.LoadLevelAdditive (obsolete) or SceneManager.LoadScene("sceneName",LoadSceneMode.Additive); to extend the current scene which has nothing to do with what you are asking.

What you can do:

Position multiple cameras in different places in the-same scene then render each camera to different display.

The max supported display is 8.

You can use Display.displays.Length to check the amount Displays connected.

Display.displays[0] is the main/primary display.

Display.displays[1] Next display

Display.displays[2] Next display

Display.displays[3] Another Next display

Call the Activate function to activate the display.

Display.displays[1].Activate();

When activating the display, you can also provide the width, height and refresh rate. (For Windows only)

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

Before you activate the display, make sure to set the display index to a camera.

MyOtherCamera.targetDisplay = 1; //Make MyOtherCamera to display on the second display. You can now call the Activate function.

Let's say we have 4 cameras and 4 displays and we want to display each camera to each display.

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....");
}