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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM