Standart Fizik ile Çarpışma Kullanımı (2D)

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 ipucu iki nesne yerleştirir, böylece bir nesneyi manipüle etme ve Unity'nin standart fiziğini kullanarak diğeriyle temas ettiğinde diğerini itme davranışını uygulayabilirsiniz.

Bu arada, ayarların çoğu, önceki "Nesnelerin birbirleriyle çarpışıp çarpışmadığını belirleme (2D)" makalesinde açıklanan prosedürle aynıdır.

Hazırlık

Buradaki prosedür önceki ipuçlarıyla neredeyse aynıdır, bu yüzden sorunsuz bir şekilde akıtalım.

Projeyi oluşturduktan sonra, nesne olacak iki hareketli grafik görüntüsü hazırlayın ve ekleyin. İ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.

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    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.

Geçen sefer, sadece vurup vurmadığım hakkında bilgi almak istedim, bu yüzden "Tetikle" yi işaretledim, ancak bu sefer yapmayacağım. Bu, fizikte çarpışma işlemeyi mümkün kılar.

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.

Aşağıda serbest düşüşü önlemek için Yerçekimi Ölçeği'ni 0 olarak ayarlayın.

Benzer şekilde, isabetleri işaretlemek Box Collider 2D için diğer "UnityTips_2" nesnesine bir bileşen ekleyin.

Ek olarak, bu sefer rakibin gücüyle hareket etmek gerekir,Rigidbody 2D bu yüzden ekleyin . Yerçekimi ölçeği 0 olmalıdır.

Hepsi bu kadar. Şu anda herhangi bir programa gerek yoktur. Oyunu çalıştırın ve başka bir nesneye dokunmayı deneyin.

Bence rakibi bu şekilde iterseniz, rakibin itilmiş gibi davranacağını doğrulayabilirsiniz. Standart fonksiyonun fiziğini kullanmak çok kolaydır çünkü herhangi bir program gerekmez.

Nesnelerin dönmesini önleme

Dokunduğunuzda görebilirsiniz, ancak isabet noktası hafifçe bile değişirse, her nesne dönecektir. Bir oyun olarak, genellikle doğal olmaz, bu yüzden dönmeyecek şekilde ayarlamanız gerekir.

Rigidbody 2D Bileşenin "Kısıtlamalar" içinde "Sabit rotasyon" adlı bir öğesi vardır, bu nedenle Z'yi kontrol edin. Artık dönmemesi için çalışabilirsiniz. İki nesneye ayarlamayı ve kontrol etmek için oyunu çalıştırmayı deneyin.

Bence hangi açıdan iterseniz itin dönmediğinden emin olabilirsiniz.

Nesneler birbirine çarptığında bir şeyler yapın

Örneğin, düşmanın sağlığını azaltırken rakibi iterken düşmana isabet eden bir mermi uygulamak isteyebilirsiniz. Bu, olay gerçekleşeceği için önceki ipuçlarıyla aynıdır, böylece onunla başa çıkabilirsiniz.

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 OnCollisionEnter2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnCollisionStay2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnCollisionExit2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionExit2D : {partner.collider.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 OnCollisionEnter2D(Collision2D partner)
{
  TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
  TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
  TextState.text = $"OnCollisionExit2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Önceki ipuçlarına benzer şekilde------, ancak yöntem adı artık "OnTrigger2D" yerine "OnCollision------2D" şeklindedir.

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.

OnCollisionEnter2D Nesneler birbirine çarptığında
OnCollisionStay2D Nesneler birbirine çarparken
OnCollisionExit2D Nesneler çarpışma durumundan çıktığında

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

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

OnCollisionStay2D ç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 OnCollisionStay2D çağrılacaktır. Yöntemin belirli bir süre sonra OnCollisionStay2D 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 OnCollisionStay2D , yöntemin kendisi çağrılmaz.