Unity3D: Displaying different scenes on multiple monitors

19,078

Solution 1

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

Solution 2

In addition to the other answers, if you really want to display a different scene on another monitor, you could make sure everything in that scenes is on a specific layer. Then on the camera in that scene set the cullingmask to render only that layer, and on your main camera exclude that layer. Then just load the scene additively as was mentioned.

This is basically how Unity's previewer works too (although rather than a scene it instantiates a hidden prefab).

Solution 3

same solution here :
Multi-display

Multi-display allows you to display up to 8 different camera views of your application on up to 8 different monitors at the same time. You could use this for PC games, arcade game machines and simple installations for public display.

Multi-display only runs in standalone mode, and is supported on Windows, Mac OS X and Linux.

Previewing Multi-display in your project

To see the different monitor displays:

Set each Camera to display to a specific monitor, using its Inspector. You can assign between 1 and 8 display monitors via the Target Display option (see Fig. 1).

Fig. 1: Camera Inspector with Target Display option
enter image description here
Fig. 1: Camera Inspector with Target Display option You can then preview each display in the Game View, using the drop-down Display menu in the top left-hand corner of the view (see Fig. 2).

Fig 2: Display preview in the top left corner of the Game View
enter image description here
Fig 2: Display preview in the top left corner of the Game View Activating Multi-display

The default display is one monitor, so when you run your application, you need to explicitly activate any additional displays via scripting, using Display.Activate. You need to explicitly activate each additional display and, once activated, you cannot deactivate them.

The best time to activate additional displays is upon creating a new Scene. A good way to do this is to attach a script component to the default Camera. Make sure you call Display.Activate only once during the startup. You may find it helpful to create a small initial scene to test it.

Example script

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 support

The following UnityEngine.Display API functions are supported:

public void Activate()

This activates a specific display on the current monitor’s width and height. This call must be made once upon starting a new Scene. It can be called from a user script attached to a Camera or dummy GameObject in a new scene.

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

Windows only: This activates a specific display on a custom monitor’s width and height.

Share:
19,078
silentcoder
Author by

silentcoder

I'm a professional systems programmer from Cape Town. In my dayjob I write high-performance operating system deployment technologies on top of Linux, in my evenings I write free and open source software, usually just fun projects (like a toolkit for AD&amp;D dungeon masters).

Updated on June 14, 2022

Comments

  • silentcoder
    silentcoder almost 2 years

    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 ?