Unity 限制角色移動不超出畫面的作法


建立時間: 2022年11月2日 14:52
更新時間: 2023年6月22日 04:52

說明

除了自己做牆壁以外,我在網路看到一篇教學,只需一個腳本就能讓角色移動不超出螢幕,無需做牆壁,可能是版本的關係,我使用的是2021.3.12f1版,教學提供的版本邊界計算似乎不對,我自己有修改了程式。

腳本

做法是取得畫面的邊界,角色每次移動都檢查,讓角色不能超出邊界,因為角色會在 Update() 更新移動,所以在 LateUpdate() 檢查角色是否超出邊界即可

Boundaries.cs

using UnityEngine;

public class Boundaries : MonoBehaviour
{
    /// <summary>
    /// 螢幕邊界
    /// </summary>
    private Vector2 screenBounds;

    /// <summary>
    /// 物件高度一半
    /// </summary>
    private float objectHalfHeight;

    /// <summary>
    /// 物件寬度一半
    /// </summary>
    private float objectHalfWidth;

    private void Awake()
    {
        objectHalfHeight = transform.GetComponent<SpriteRenderer>().bounds.extents.y;
        objectHalfWidth = transform.GetComponent<SpriteRenderer>().bounds.extents.x;
        screenBounds = Camera.main.ScreenToWorldPoint(
            new Vector3(Screen.width, Screen.height, Camera.main.transform.position.z)
        );
    }

    private void LateUpdate()
    {
        Vector3 viewPosition = transform.position;
        viewPosition.x = Mathf.Clamp(
            viewPosition.x,
            screenBounds.x * -1 + objectHalfWidth,
            screenBounds.x - objectHalfWidth
        );
        viewPosition.y = Mathf.Clamp(
            viewPosition.y,
            screenBounds.y * -1 + objectHalfHeight,
            screenBounds.y - objectHalfHeight
        );
        transform.position = viewPosition;
    }
}

Mathf.Clamp() 是夾住的意思,如果第一個參數在範圍內就回傳第一個數,否則就回傳最接近範圍的數

Mathf.Clamp(5, 1, 10); // 5
Mathf.Clamp(0, 1, 10); // 1
Mathf.Clamp(20, 1, 10); // 10

參考

觀看次數: 2269
boundaryscreenunity邊界
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!