確定物件是否相互碰撞 (2D)
驗證環境
- 窗戶
-
- 視窗 11
- 統一編輯器
-
- 2021.3.3f1
- 輸入系統包
-
- 1.3.0
此提示的先決條件
作為此提示描述的前提,已預先進行了以下設置。
起先
此提示說明如何確定兩個物件是否接觸。 使用鍵盤移動一個物件。
製備
創建專案后,準備兩張將成為物件的精靈圖像。 如果你準備起來很麻煩,你可以放置兩個相同的精靈,但這次為了清楚起見,我們將將它們分開。 名稱分別為“UnityTips”和“UnityTips_2”。
通過將兩個圖像檔拖放到視圖中來添加它們。
添加文稿以使用鍵盤移動左側物件。 文稿名稱 Player
為 。
腳本內容類似於移動、旋轉和縮放精靈中的提示。
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
// スプライトの移動処理
// Translate メソッドでスプライトの位置が移動します
// Space.World を指定すると回転の影響をうけません
if (keyboard.leftArrowKey.isPressed)
{
transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
transform.Translate(0, -0.1f, 0, Space.World);
}
}
}
附加到要對其運行腳本的物件。
運行遊戲並檢查它是否適用於鍵盤上的游標鍵。
最後,放置一個文本對象以顯示碰撞檢測狀態。
物件名稱 TextState
為 。
碰撞處理設置
從這裡,您可以配置與碰撞相關的設置。
首先,選擇要移動的物件“UnityTips”,然後從檢查器中按兩下“添加元件”。
從 Physics 2D
清單中選擇。 Physics
是一個 3D 物件,所以不要搞錯。
Physics 2D
Box Collider 2D
從中選擇。 由於此子畫面是矩形的,因此會選擇Box,但如果它是圓形的,例如,請選擇其他形狀,例如圓形。
Box Collider 2D
由於將添加元件,請從參數中選中「使其觸發」。
這將允許您僅獲取有關「是否擊中」 的資訊。
Rigidbody 2D
然後添加的元件。 您可以從「物理 2D -> 剛體 2D」中添加它。
Rigidbody
為物件提供物理資訊Collider
,還可以確定與具有的物件的碰撞。
Rigidbody
但是,如果你有一個元件,它還將包含 -Y 方向的重力資訊,所以如果你執行它,它會掉下來。
因此,從參數中將「重力刻度」設置為 0。
順便說一句,如果是橫向卷軸動作遊戲,那麼在自由落體的意義上使用重力刻度可能會很方便。
同樣,將元件 Box Collider 2D
添加到另一個物件“UnityTips_2”。
這次是受影響的一側,因此您無需更改任何設置。
Player
開啟文稿並使用如下方式添加每個欄位和方法:
using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class Player : MonoBehaviour
{
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
// 中略
<summary>衝突した瞬間に呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerEnter2D(Collider2D partner)
{
TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
}
由於我們想要顯示有關它是否被擊中的資訊,因此我們可以將其顯示在文本物件中,如下所示。
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
碰撞檢測過程描述如下。
<summary>衝突した瞬間に呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerEnter2D(Collider2D partner)
{
TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
Rigidbody 2D
當一個物件與另一個具有 . 的物件發生 Collider 2D
碰撞時,會發生上述每個事件。
這將允許您確定和處理它是否正確。
有三個事件,每個事件在以下時間調用。
OnTriggerEnter2D | 當物體相互撞擊時 |
OnTriggerStay2D | 當物體相互撞擊時 |
OnTriggerExit2D | 當物件離開碰撞狀態時 |
在這兩種情況下,對手物件接收對手的對象作為參數,因此您可以通過查找Collider2D.gameObject
擊中的目標類型(敵人、Collider2D.tag
物品等)來獲取對手的物件Collider2D
。
OnTriggerEnter2D
以上三個事件中,每次OnTriggerExit2D
碰撞調用一次。
OnTriggerStay2D
在碰撞期間每幀調用一次,但在兩個物件都停止后經過一定時間后不再調用該事件。
這是因為它被認為已進入睡眠狀態,並且計算與不移動的東西的每一幀碰撞被認為是浪費處理。
如果 Rigidbody 2D
不希望它進入睡眠狀態,請將參數的睡眠模式更改為“不睡眠”。
更改代碼后,設置用於顯示資訊的文字。
運行遊戲並使用鍵盤移動物件以觸摸另一個精靈。 您可以看到為每個函數調用了三個函數。
順便說一下,如果您觸摸一個物件然後停止移動,則會在短時間內調用 OnTriggerStay2D
該方法。
您應該能夠看到該方法在一段時間后 OnTriggerStay2D
不再被調用。
這表示您已進入睡眠狀態,但如果您想更改進入此睡眠之前的時間,您可以通過從專案設置中選擇“2D Physics”並指定“睡眠時間”參數(以秒為單位)來更改它。
它不能設置為0,但如果設置為 OnTriggerStay2D
無限小,則不會調用方法本身。