1. 程式人生 > 實用技巧 >Unity 如何在視窗大小可以隨意改變的情況下讓遊戲世界完整的顯示在鏡頭中

Unity 如何在視窗大小可以隨意改變的情況下讓遊戲世界完整的顯示在鏡頭中

當我們開發遊戲時,如果是開發手機遊戲,螢幕視窗的比例是固定的,不會說在執行時改變的。

但是,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],在開發時請務必備份場景中的內容。