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邊界
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!