當我們開發游戲時,如果是開發手機游戲,屏幕窗口的比例是固定的,不會說在運行時改變的。
但是,PC端的游戲就不一定,我希望它能被用戶隨意拉扯,但完整的內容還是能顯示出來,這里我直接放例子:
請注意黑色的部分,可以看到,不管窗口被如何拉扯,游戲的內容還是被完整的顯示了出來,窗口能被隨意的拉伸,用戶的體驗更好。
那么來講一講Unity如何實現這種效果:
首先是UGUI,UGUI實現有現成的方案,可以通過設置Canvas 和 Canvas Scaler 來適配窗口
關鍵在於Screen Match Mode 的 Expand(擴展)效果,當我們拉扯窗口時,無論怎樣UI都會完整的顯示。
演示下效果(效果可能不太直觀,見諒):
但問題來了,UI是能適配屏幕的,但是游戲世界是不會適配的。(這句話有歧義,實際是游戲世界的大小是不變的,變的是攝像機的視角)
所以接下來引出問題的關鍵:
首先,創建一個Sprite,用100*100的純白圖片作為sprite,將Sprite的大小放大為寬16單位,高9單位(符合屏幕比例):
將攝像機的Y坐標設為0,size設為4.5(事前准備),當然這里攝像機為正交類型
Camera 的size是一個很重要的屬性,它決定了攝像機的高度的一半對應游戲世界的高度:比如說這里size為4.5,size*2 = 9 個單位,對應了上圖。在這里,游戲世界被完整的呈現在屏幕里。
size對應的是攝像機的高度,所以攝像機是有高度適配的,它工作的效果如下:
就算你把屏幕的高度拉的很低,游戲的內容始終會完整的顯示在屏幕中。但問題來了,size針對高度,但它不針對寬度,這就有一個問題,比如說我把寬度拉的很小:
游戲的內容並沒有完整的顯示在屏幕上(右圖白色的框對應屏幕大小,灰色對應游戲的對象 大小19:6)
這時候想要讓游戲世界完整的顯示,顯然需要讓Camera的size變大,讓攝像頭屏幕大小包含游戲對象。
腳本 CameraAdjust.cs
1 using UnityEngine; 2 3 [ExecuteInEditMode] 4 public class CameraAdjust : MonoBehaviour 5 { 6 private const float DEFAULT_RATIO = 16f / 9f; 7 private int m_ScreenWidth; 8 private const float DEFAULT_SIZE = 4.5f; 9 10 private void Start() 11 { 12 m_ScreenWidth = Screen.width; 13 } 14 15 private void LateUpdate() 16 { 17 if (m_ScreenWidth != Screen.width) 18 { 19 m_ScreenWidth = Screen.width; 20 21 float width = Screen.width; 22 float height = Screen.height; 23 float ratio = width / height; 24 if (ratio > DEFAULT_RATIO) 25 { 26 if (Camera.main.orthographicSize != DEFAULT_SIZE) 27 Camera.main.orthographicSize = DEFAULT_SIZE; 28 } 29 else 30 { 31 Camera.main.orthographicSize = DEFAULT_SIZE * (DEFAULT_RATIO) / (width / height); 32 } 33 } 34 } 35 }
效果如下:
這里有兩個需要注意的點:
1.Screen.width 和 height 的是int變量,運算時需要轉化為float
2.在調試代碼時請謹慎使用 [ExecuteInEditMode],在開發時請務必備份場景中的內容。