Unity 多屏(分屏)顯示,Muti_Display
最近項目有個需求,主要用於在展廳的展示游戲。
比如,在一個很大的展廳,很大的顯示屏掛在牆上,我們不可能通過操作牆上那塊顯示器上的按鈕來控制游戲。
這時候有一個小的顯示器(比如一個控制器或者一個手機)
我們要做的是:掛在牆上的大顯示器用來展示3D游戲場景,而所有的UI控制則全部顯示在“控制器“上。
這在Unity里面應該怎樣實現:
1.先看Unity官方文檔
https://docs. unity3d.com/Manual/MultiDisplay.html
有這么一個Muti-Display
Muti-display允許最多8geCamera視圖,最多8個不同的顯示器顯示。可用於PC端游戲,拱屏設備(跟環屏設備一個意思,我猜多),和一些公用的展示設備。其實就一個意思:
也就是只支持PC端。
2.接下來就是一些設置
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 ).
對每一個相機進行單獨設置顯示在指定的顯示器上,通過Camera的屬性Inspector窗口,你可以通過 Target Display下拉列表來指定1到8的任意顯示器。
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 ).
通過Game視圖左上角的Display1下來菜單可以選擇你要預覽的視圖。
note:如果你想要同時預覽兩個Game視圖,在任意標簽 右鍵->Add Tap ->Game,在新的Game視圖設置Display2。
3.最后就是激活了。
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.
默認情況下,只有一個顯示器,所以當你運行程序的時候,你需要明確地激活額外的顯示器,可以通過代碼 Display.Activate來實現,需要注意的是,只需要激活一次,一旦激活了,就不能關閉激活狀態。
4.請看官方代碼。很簡單,這里說一點需要注意的就是 Display.displays.Length這個屬性,在Editor下,無論你的主機連接了多少個顯示器,Display.displays.Length的值都是1。只有打包運行的時候,返回值才是真的連接的顯示器個數(當然如果你想測試一下不連顯示器看看返回值是多少,你試試,如果有結果記得回來評論,哈哈哈)
簡單介紹這么多,說說怎么操作吧。我的Sample是 左邊顯示器顯示一個button,點擊button在右邊顯示器上創建一個Cube.
1.新建項目,新建Scene,默認的即可。在MainCamera的屬性窗口 找到TargetDisplay,默認值是Display1,那就讓它默認值好了。這個MainCamera主要是用於渲染3D場景的,也就是本Sample中的 “右邊顯示器”。
2.新建一個Camera 命名為UICamera,在屬性窗口,Camera下需要設置兩個地方:a.CullingMask,不用多解釋了,這里只渲染UI界面,b.TargetDisplay 設置為Display2.
3.創建Button按鈕,我這里用的UGUI(新版本的UGUI個人覺得已經很完美了,果斷拋棄了NGUI,要做圖集,麻煩),UGUI自然會有一個Canvas,是的,Canvas下也有一個TargetDisplay屬性,將它設置為Display2,因為我只想讓UI在“左邊顯示器”上顯示。
到目前,一切基本就緒了,這時候在Game視圖的左上角切換Display1和Display2會看到Display2只有一個Button,切換到Display1時什么都沒有(因為MainCamera渲染的場景中什么都沒有)。
4.代碼。
首先是激活顯示器,像上邊翻譯的一樣,然后是點擊按鈕創建Cube,都是很簡單的代碼。
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
Debug.Log("displays connected: " + Display.displays.Length);
// Display.displays[0] 是主顯示器, 默認顯示並始終在主顯示器上顯示.
// 檢查其他顯示器是否可用並激活.
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 () {
}
}
最后就是打包發布了。
看下效果吧
按鈕在左邊顯示器
