Nesnelerin birbirleriyle çarpışıp çarpışmadığını belirleme (2B)
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 2D
Box 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.