Nesnelerin birbirleriyle çarpışıp çarpışmadığını belirleme (2B)

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2021.3.3f1
Giriş Sistemi Paketi
  • 1.3.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

İlk başta

Bu ipucunda, iki nesnenin temas halinde olup olmadığının nasıl belirleneceği açıklanmaktadır. Bir nesneyi klavyeyle taşıyın.

Hazırlık

Projeyi oluşturduktan sonra, nesne olacak hareketli grafiğin iki görüntüsünü hazırlayın. Hazırlanması zahmetliyse, iki özdeş sprite yerleştirebilirsiniz, ancak bu sefer netlik için onları ayıracağız. İsimler sırasıyla "UnityTips" ve "UnityTips_2" dır.

İki görüntü dosyasını görünüme bırakarak ekleyin.

Sol nesneyi klavyeyle taşımak için bir komut dosyası ekleyin. Komut dosyası adı Player şeklindedir. Komut dosyası içeriği, hareketli grafiği taşıma, döndürme ve ölçeklendirme bölümündeki ipuçlarına benzer.

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);
    }
  }
}

Komut dosyasını çalıştırmak istediğiniz nesneye iliştirin.

Oyunu çalıştırın ve klavyenizdeki imleç tuşlarıyla çalışıp çalışmadığını kontrol edin.

Son olarak, çarpışma algılama durumunu görüntülemek için bir metin nesnesi yerleştirin. Nesne adı TextState şeklindedir.

Çarpışma İşleme Ayarları

Buradan, çarpışmalarla ilgili ayarları yapılandırabilirsiniz.

İlk olarak, taşımak istediğiniz nesneyi seçin, "UnityTips" ve denetçiden "Bileşen Ekle" yi tıklayın. Physics 2D Listeden seçim yapın. Physics bir 3B nesnedir, bu yüzden hata yapmayın.

Physics 2DBox Collider 2D arasından seçim yapın. Bu hareketli grafik dikdörtgen olduğundan, Kutu seçilir, ancak daire şeklindeyse, örneğin, Daire gibi diğer şekilleri seçin.

Box Collider 2D Bileşen ekleneceğinden, parametrelerden "Tetiklemesini sağla" seçeneğini işaretleyin. Bu, yalnızca "vurup vurmadığınız" hakkında bilgi almanızı sağlayacaktır.

Rigidbody 2D Ardından bileşenlerini ekleyin. "Physics 2D -> Rigidbody 2D" den ekleyebilirsiniz. Rigidbody Nesneye fizik bilgisiCollider verir ve ayrıca sahip olan nesnelerle çarpışmaları belirleyebilir.

Rigidbody Bununla birlikte, bir bileşeniniz varsa, -Y yönünde yerçekimi bilgilerini de içerecektir, bu nedenle onu çalıştırırsanız, düşecektir. Bu yüzden parametrelerden "Yerçekimi Ölçeği" ni 0 olarak ayarlayın.

Bu arada, yandan kaydırmalı bir aksiyon oyunuysa, yerçekimi ölçeğini serbest düşüş anlamında kullanmak uygun olabilir.

Benzer şekilde, diğer "UnityTips_2" nesnesine Box Collider 2D bir bileşen ekleyin. Bu sefer etkilenen taraf budur, bu nedenle herhangi bir ayarı değiştirmeniz gerekmez.

Player Komut dosyasını açın ve aşağıdaki gibi kullanarak her alanı ve yöntemi ekleyin:

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}";
  }
}

Vurulup vurulmadığına dair bilgileri görüntülemek istediğimiz için, aşağıdaki gibi bir metin nesnesinde görüntülemeyi mümkün kılacağız.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

Çarpışma algılama işlemi aşağıdaki gibi açıklanmaktadır.

/// <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 Yukarıdaki olayların her biri, sahip olan bir nesne sahip olan başka bir nesneyle Collider 2D çarpıştığında oluşur. Bu, doğru olup olmadığını belirlemenize ve işlemenize olanak tanır.

Her biri aşağıdaki zamanlamada çağrılan üç olay vardır.

OnTriggerEnter2D Nesneler birbirine çarptığında
OnTriggerStay2D Nesneler birbirine çarparken
OnTriggerExit2D Nesneler çarpışma durumundan çıktığında

Her iki durumda da, rakip nesne rakibin nesnesini bir argüman olarak alır, böylece rakibin Collider2D nesnesini vurduğu hedefin türüne (düşman, Collider2D.tag eşya vb.) bakarak Collider2D.gameObject alabilirsiniz.

Yukarıdaki üç olaydan ve OnTriggerEnter2D OnTriggerExit2D çarpışma başına bir kez çağrılır.

OnTriggerStay2D çarpışma sırasında her kare olarak adlandırılır, ancak her iki nesne de durduktan sonra belirli bir süre geçtikten sonra olay artık çağrılmaz. Bunun nedeni, uyku durumuna girdiği düşünülür ve her karede hareket etmeyen bir şeyle çarpışmaları hesaplamak için bir işlem israfı olarak kabul edilir.

Rigidbody 2D Uyumasını istemiyorsanız, parametrenin uyku modunu "Uyuma" olarak değiştirin.

Kodu değiştirdikten sonra, bilgileri görüntülemek için metni ayarlayın.

Oyunu çalıştırın ve başka bir hareketli çizgiye dokunmak için nesneyi klavyeyle hareket ettirin. Her biri için üç işlevin çağrıldığını görebilirsiniz.

Bu arada, bir nesneye dokunursanız ve sonra hareket etmeyi bırakırsanız, yöntem kısa bir süre için OnTriggerStay2D çağrılacaktır. Yöntemin belirli bir süre sonra OnTriggerStay2D artık çağrılmadığını görebilmeniz gerekir.

Bu, bir uyku durumuna girdiğinizi gösterir, ancak bu uykuya girene kadar geçen süreyi değiştirmek isterseniz, proje ayarlarından "2B Fizik" i seçip "Uyku süresi" parametresini saniye cinsinden belirterek değiştirebilirsiniz. 0 olarak ayarlanamaz, ancak sonsuz küçük olarak ayarlanırsa OnTriggerStay2D , yöntemin kendisi çağrılmaz.