2016-09-21 171 views
1

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

+0

你想在同一时间显示这两个场景或一次只显示一个? – Programmer

+0

与此同时。我特别感兴趣的是尝试编写Kerbal Space Program的Mod,以使用新的Unity多监视器支持,允许用户在主屏幕上显示飞行视图时,在辅助屏幕上显示mapview或IVA视图。 – silentcoder

回答

3

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

,你不能。

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

是的!Display类。

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

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

你可以做什么:

位置多台摄像机在不同的地方在的,相同的场景然后渲染每个摄像机不同的显示。

最大支持的显示器是。

您可以使用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...."); 
} 
+0

是否可以使用连接到相机对象的相机组件中的目标显示激活显示? – Hamid

+1

我真的不明白你的问题,但你必须将显示号码分配给相机的目标('Camera.targetDisplay'),然后调用'Display.display [index] .Activate()'使相机的图像显示在监控。我在答案中讨论了所有这些。 – Programmer

1

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

多显示器可以让你在同一时间最多可显示多达8个不同的监控8个不同的摄像机视图您的应用程序。您可以将其用于PC游戏,街机游戏机和简单的公共显示装置。

多显示器只能在独立模式下运行,并且在Windows,Mac OS X和Linux上受支持。在您的项目

预览多显示器要查看不同显示器显示:

设置每个摄像头显示某个监视器,使用它的督察。您可以通过目标显示选项在1到8个显示器之间进行分配(参见图1)。

图1:相机督察与目标显示选项
enter image description here
图1:相机督察与目标显示选项 然后,您可以预览在游戏中查看每个显示,使用下拉显示菜单该视图的左上角(见图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() 

这激活所述电流监控器的宽度和高度的特定显示。在开始新场景时必须进行一次该调用。它可以从连接到相机的用户脚本或新场景中的虚拟游戏对象中调用。

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

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

1

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

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

相关问题