Unity3D:在多台显示器上显示不同的场景

时间:2016-09-21 13:53:29

标签: c# unity3d scene display multiple-monitors

Unity3D在最新版本中具有本机多监视器支持。 API文档表明,这与将每个显示器连接到摄像机视图有关。 相反,是否可以将显示器映射到场景?那么有两台显示器的用户可以在其中一台显示器上显示两个不同的场景? 如果有可能,怎么会这样做呢?

5 个答案:

答案 0 :(得分:4)

  

在多台显示器上显示不同的场景?

,你不能。

  

在多台显示器上显示同一场景中的不同摄像机?

使用Display课程

是!

事实是你不能同时运行两个不同的场景。你不能。

但是,您可以使用Application.LoadLevelAdditive(过时)或SceneManager.LoadScene("sceneName",LoadSceneMode.Additive);扩展当前场景,这与您的要求无关。

你能做什么:

将多个摄像机放置在相同场景中的不同位置,然后将每个摄像机渲染到不同的显示器。

支持的最大显示为 8

您可以使用Display.displays.Length检查显示已连接的数量。

Display.displays[0]是主要/主要显示。

Display.displays[1]下一个显示

Display.displays[2]下一个显示

Display.displays[3]另一个下一个显示

调用激活功能以激活显示。

Display.displays[1].Activate();

激活显示屏时,您还可以提供宽度,高度和刷新率。 (仅适用于Windows

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

在激活显示之前,请务必将显示索引设置为相机。

MyOtherCamera.targetDisplay = 1; //让MyOtherCamera显示在第二个显示屏上。您现在可以调用激活功能。

假设我们有4个摄像头和4个显示器,我们希望在每个显示器上显示每个摄像头。

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

答案 1 :(得分:2)

除了其他答案之外,如果您真的想在另一台显示器上显示不同的场景,您可以确保该场景中的所有内容都在特定图层上。然后在该场景中的摄像机上设置剔除遮罩以仅渲染该层,并在主摄像机上排除该层。 然后就像上面提到的那样加载场景。

这基本上是Unity的预览器的工作原理(虽然它不是一个实例化隐藏预制件的场景)。

答案 2 :(得分:1)

相同的解决方案here
多显示器

多显示屏允许您同时在多达8个不同的显示器上显示最多8个不同的应用程序相机视图。您可以将它用于PC游戏,街机游戏机和公共显示的简单安装。

多显示器仅在独立模式下运行,并且在Windows,Mac OS X和Linux上受支持。

预览项目中的多显示器

要查看不同的监视器显示:

使用其检查器将每个摄像头设置为显示到特定监视器。您可以通过目标显示选项分配1到8个显示监视器(参见图1)。

图。 1:带目标显示选项的摄像机检查器
enter image description here
图1:带有目标显示选项的Camera Inspector 然后,您可以使用视图左上角的下拉显示菜单预览游戏视图中的每个显示(参见图2)。

图2:游戏视图左上角的显示预览
enter image description here
图2:游戏视图左上角的显示预览 激活多显示器

默认显示是一个监视器,因此在运行应用程序时,需要使用Display.Activate通过脚本显式激活任何其他显示。您需要明确激活每个附加显示,并且一旦激活,您就无法停用它们。

激活其他显示的最佳时间是创建新场景。执行此操作的一种好方法是将脚本组件附加到默认的Camera。确保在启动期间仅调用Display.Activate一次。您可能会发现创建一个小的初始场景来测试它是有帮助的。

示例脚本

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支持

支持以下UnityEngine.Display API函数:

public void Activate()

这将激活当前显示器宽度和高度的特定显示。在开始新场景时必须进行一次此调用。它可以从附加到Camera的用户脚本或新场景中的虚拟GameObject调用。

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

仅限Windows:这会激活自定义显示器宽度和高度的特定显示。

答案 3 :(得分:0)

为了帮助其他人,我不得不创建第二个游戏屏幕,然后一切正常。希望这会有所帮助

第1步,我用一个空格保存显示脚本。

我在MainCamera2上使用了此脚本

// P.S。将第二台摄像机的显示更改为2

public Camera MyOtherCamera;

private void Start()
    {

    }
    public void Activate(int width, int height, int refreshRate)
    {
        MyOtherCamera.targetDisplay = 1;
        //        Display.displays[0].Activate();
        Display.displays[1].Activate();
    }
}

答案 4 :(得分:0)

此外,为了在游戏视图中看到此图像,请打开第二个游戏场景并将其拖动到监视器2,否则它将在您构建和运行时起作用而无需执行此操作。 / p>