確定物件是否相互碰撞 (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 2DBox 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 無限小,則不會調用方法本身。