7-7 Creating A Simple 2D Game For Reinforcement Learning (3)
今天要來製作攝影機跟隨角色的功能 ,首先,我們從素材庫找到back跟middle兩個背景圖檔,並拉進場景中。
拉進場景後,你會發現背景圖將我們的主角與其他佈置都遮住了。
我們可以透過調整Z軸來解決背景與主角的遮擋問題。
由於主角與其他場景的Z軸位於0,而背景的Z軸位於0.1,所以會比較靠後。
但此時,你可能會發現,場景中仍有部分物體被遮擋。
假設,我們繼續調整Z軸,把背景的Z軸調到1,問題是否就能解決了呢?
然後繼續拓展我們的背景圖。
接著將middle的背景圖也加進來,這時會發生一個可怕的問題,middle與back的背景圖互相混淆在一起。即使你嘗試著調整Z軸數值,也一直會發生這個問題。
主因是我們的Main Camera的Projection設定為Perspective,這是在2D平面模擬3D視角所使用的攝影機種類,越遠越深的物品看起來越小,越近的物品看起來越大。由於我們現在要製作的是2D遊戲,考量到並不需要模擬3D視角的功能,所以將Projection調整為Orthographic。
關於更多Perspective與Orthographic的比較,可以參考下列影片:
Perspective vs Orthographic Cameras in Unity
https://www.youtube.com/watch?v=c_WVffzc6GU
此時,從遊戲畫面中,看起來是沒有問題了。使用Perspective或Orthographic都可以製作2D遊戲,如果你想要在某些畫面中模擬出3D的效果,就應該嘗試用Perspective。
再來,我們要在場景中建立一個Empty GameObject名為CameraRange,這是用來定義攝影機移動的範圍的。
替CameraRange設定Box Collider,由於Box Collider與Box Collider2D不會互相影響,所以不用擔心角色移動會受到影響。
接著,如下圖,替你的場景設定攝影機的拍攝範圍。由於原本的天空背景會擋住綠色的框框,我暫時關閉了。
到時候,我們可以使用Box Collider的bounds參數取得該範圍的最小值與最大值。
如下圖,我標示了bounds.min與bounds.max的位置落點。
接著,我們來撰寫CameraFollow的程式吧,下列提供程式碼,並且都已經使用註解說明細節了。
using UnityEngine; public class CameraFollow : MonoBehaviour { [SerializeField] Transform player; [SerializeField] Collider cameraRange; [SerializeField] Camera currentCamera; void Update() { // 取得可移動範圍的邊界的最小值與最大值 Vector3 minRange = cameraRange.bounds.min; Vector3 maxRange = cameraRange.bounds.max; // 先取得Orthographic Camera的寬與高 float height = 2f * currentCamera.orthographicSize; float width = height * currentCamera.aspect; // 使用寬與高的一半,作為Offset float offsetX = width / 2; float offsetY = height / 2; // 設定攝影機的X座標,跟隨Player的位置 Vector3 newPosition = transform.position; // 使用Mathf.Clamp可以限制數值不低於minRange,不高於MaxRange newPosition.x = Mathf.Clamp(player.position.x, minRange.x + offsetX, maxRange.x - offsetX); newPosition.y = Mathf.Clamp(player.position.y, minRange.y + offsetY, maxRange.y - offsetY); transform.position = newPosition; } }
程式碼中的OffsetX與OffsetY的距離範圍如下,你可以將Orthographic的攝影機範圍看成是一個正方形,而我們的攝影機只能夠在minRange與maxRange的範圍內移動。
所以,minRange加上OffsetX、minRange加上OffsetY,就是我們攝影機的最小移動範圍,反之亦然。
接著,我將Camera Follow程式放在Main Camera的組件,並設定好三個參數。
接著執行遊戲看看!效果動畫圖如下:
留言
張貼留言