❀ 前言 ❀

今天實作內容:
在玩家腳底新增偵測器決定該角色是否離開地板
也可運用在牆跳偵測器

注意,此教程內容為 Unity2D 在 Unity3D 中有一些函式會不符
請小心服用

❀ 正題 ❀

主畫面:物件設定

首先,要先創建一個空物件,我命名為:GroundDetector
把它拉到 Player 物件底下(才會跟著玩家動)
並為他新增一個腳本,這邊我命名為:PlayerGroundDetector

創建空物件

拉到 Player 物件底下

寫程式:PlayerGroundDetector.cs

Key:Physics2D.OverlapCircleNonAlloc()
本次內容最重要的函示就是 OverlapCircleNonAlloc()
用來做一個圓型的偵測範圍。
它裡面需要的參數如下

  1. point:圓心位置
  2. radius:圓型半徑
  3. results:一個 Array,讓函式告訴你他偵測到的所有人
  4. layerMask:判斷哪個層級為有效層級

point 無庸置疑就是空物件的座標,因此不須宣告
radius,是我們會比較常更改的,因此宣告時使用 [SerilizeField] 提示詞
results,只需腳本中知道就好(如非你想讓他傳給其他人),也不是我們會去改動的,因此使用 private 即可
layerMask,我有使用 [SerilizeField],更方便在修改層級時,判斷他要偵測的層級

有了上述邏輯,就可以開始寫程式了

1
2
3
4
5
6
7
8
public class PlayerGroundDetector : MonoBehaviour
{
[SerializeField] float detectionRadius = 0.1f;
[SerializeField] LayerMask groundLayer;
Collider2D[] colliders = new Collider2D[1];

public int isGrounded => Physics2D.OverlapCircleNonAlloc(transform.position, detectionRadius, colliders, groundLayer) > 0;
}

最後一行的 isGrounded,我設定為 public,方便其他腳本得知玩家是否落地
=> 代表的是 get 也就是唯讀的概念啦~
由於 OverlapCircleNonAlloc() 會回傳一個 int 告訴使用者他偵測到幾個人
而我們只需知道是否觸地(偵測數 > 0)即可
若想知道偵測對象,會被裝在colliders中,因此攻擊判斷也可使用此函式。

OK,再來為了讓我們方便管理這個看不到的東西
這邊要用到 Gizmos,畫出偵測的範圍。
這邊我們使用 Unity 預設函式 OnDrawGizmosSelected()

1
2
3
4
5
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(transform.position, detectionRadius);
}

主畫面:函式參數設置

回到主畫面,點擊 GroundDetector 就能看到綠色的圓形了

這裡右邊可以設定半徑大小,與要偵測哪個層級。
下面(Game 視窗)可以點選 Gizmos 使其在運行時可見。

點擊 GroundDetector 按下 F 聚焦 (Focus) 並點選 W (右邊移動工具) 將其移動到玩家腳下
修改 radius 至適當值後,我們就來做最後一件事 -- 設定層級。

點選地板,並選擇 Layer => Add Layer
選個 User Layer,命名為 Ground (或你想要的名字)
點選地板,再次按下 Layer,就會發現 Ground 層級出現啦~

將地板都改為 Ground 層級後,別忘了把 PlayerGroundDetector 的 layerMask 也設定為 Ground
大功告成,熱騰騰的偵測器就能用啦!

❀ 後話 ❀

除了圓形,也有其他形狀
但我太懶了=v=,就等各位自行去研究啦!