Related Posts Plugin for WordPress, Blogger...

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的組件,並設定好三個參數。

接著執行遊戲看看!效果動畫圖如下:

留言