【问题标题】:Unity3D: Displaying different scenes on multiple monitorsUnity3D:在多个显示器上显示不同的场景
【发布时间】:2017-01-29 19:47:33
【问题描述】:

Unity3D 在最近的版本中具有原生多显示器支持。 API 文档建议这与将每个显示器连接到相机视图有关。 是否可以将显示映射到场景?因此,拥有两台显示器的用户可以在其中一台显示器上显示两个不同的场景? 如果可以的话,怎么做呢?

【问题讨论】:

  • 你想同时展示这两个场景还是一次只展示一个?
  • 同时。我的特别兴趣是尝试为 Kerbal Space Program 编写一个 mod,以使用新的 Unity 多显示器支持来允许用户在辅助屏幕上显示地图视图或 IVA 视图,同时在主屏幕上显示飞行视图。

标签: c# unity3d scene display multiple-monitors


【解决方案1】:

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

,你不能。

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

是的! 使用 Display 类。

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

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

你可以做什么:

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

支持的最大显示为 8

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

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

Display.displays[1] 下一个显示

Display.displays[2] 下一个显示

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

调用Activate函数来激活显示。

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

【讨论】:

  • 是否可以使用连接到相机对象的相机组件中的目标显示器来激活显示器?
  • 我真的不明白你的问题,但你必须为相机的目标分配显示编号(Camera.targetDisplay)然后调用Display.display[index].Activate() 以使该相机​​的图像显示在该监视器上。我在答案中讨论了所有这些。
【解决方案2】:

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

这也是 Unity 预览器的基本工作方式(尽管它实例化隐藏的预制件而不是场景)。

【讨论】:

    【解决方案3】:

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

    多显示器允许您在多达 8 个不同的监视器上同时显示多达 8 个不同的应用程序摄像机视图。您可以将其用于 PC 游戏、街机游戏机和用于公共展示的简单安装。

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

    在您的项目中预览多显示器

    查看不同的显示器显示:

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

    图。 1:带目标显示选项的相机检查器

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

    图 2:游戏视图左上角显示预览

    图 2:Game View 左上角的显示预览 激活多屏显示

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

    激活额外显示的最佳时间是在创建新场景时。执行此操作的一个好方法是将脚本组件附加到默认相机。确保在启动期间只调用一次 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:这会在自定义显示器的宽度和高度上激活特定显示。

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多