Kutucuk haritalarıyla isabet algılamayı uygulama

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.

Bu ipucunun önkoşulları nelerdir?

Harita materyallerini ödünç alma hakkında

Aşağıdaki sitelerden ödünç alınan işlemleri gerçekleştiriyoruz.

Yürüyen karakterlerin uygulanması

İlk olarak, isabet algılamayı gerçekleştiren bir harita ve karakter uygulayın. Bu karakter klavyedeki imleç tuşlarıyla hareket ettirilebilir. Ancak, uygun bir yürüyüş uygularsanız, kitap ipuçlarının özünden uzun ve uzak olacaktır, bu yüzden bu sefer sadece basit bir tek resmi taşıyacağım.

Yürüme animasyonları uygulamak istiyorsanız, aşağıdaki ipuçlarına bakın:

Projeyi oluşturduktan sonra, projeye taşımak istediğiniz nesnenin hareketli grafik görüntüsünü ekleyin.

Görüntüyü seçin ve Denetçi'den Birim Başına Piksel Sayısı'nı 32 olarak ayarlayın. Bunun nedeni, harita çipinin bir karesinin boyutunun 32 piksel olmasıdır, bu yüzden buna uyar. Yapılandırıldıktan sonra, aşağıdaki "Uygula" düğmesini tıklayın.

Hareketli grafiği görünüme yerleştirin.

Hareketli grafiği taşımak için bir komut dosyası oluşturun. Bu, aşağıdaki ipuçlarına benzer:

Komut dosyası adını Player olarak bırakın.

Aşağıdaki gibi kodlayın:

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

Taşımak istediğiniz hareketli grafiği ekleyin.

Oyunu çalıştırın ve klavyeyle taşımak isteyip istemediğinizi kontrol edin.

MapTips'i Hazırlama

Öncelikle bir mapchip hazırlayıp bir harita oluşturacağız. Bu yordam aşağıdaki ipuçlarına benzer: 2B Tilemap Ekstraları ile MapTips de çarpışma algılama yeteneğine sahiptir, ancak yordam uzun olacağından bu makalede kullanılmayacaktır.

MapTip'in özgün görüntüsünü hazırlayın ve projenize ekleyin. İşlemin daha kolay anlaşılmasını sağlamak için lütfen harita çipi malzemesi için "yürünebilir bir yer" ve "yürünemez bir yer" hazırlayın.

Denetçide MapChips için ayarlayın ve Uygula düğmesine tıklayın. Yapılandırıldıktan sonra Hareketli Grafik Düzenleyicisi'ni açın.

Bu 32 piksellik bir harita ipucu, bu yüzden 32'ye böleceğim.

Kutucuk paleti sekmesini seçin. Değilse, menüden "Pencere > 2B -> Karo Paleti" ile görüntüleyin. Yeni bir palet oluşturun. Adı keyfidir, ancak şimdilik buna "MapChipPalette" diyeceğiz.

Sahneler'de bir MapChipPalette klasörü oluşturun ve belirtin.

Bir harita ipucunu palete sürükleyerek ekleyin. Daha önce oluşturduğunuz MapChipPalette klasörüne kaydedin.

Harita oluşturma

Bu kez, harita isabet kararı "Tilemap" birimlerinde gerçekleştirilecek. Bu nedenle, "İsabet algılamasız Tilemap" ve "İsabet algılamalı Tilemap" olmak üzere iki Tilemap oluşturacağız.

İlk olarak, hiyerarşide iki Tilemap oluşturun. Kılavuzda iki tane oluşturabilirsiniz. İsimler netlik için "TilemapObeject" ve "TilemapGround" dur.

İlk olarak, bir "TilemapGround" oluşturun. Hareketli bir aralık olduğundan, zemini kolayca döşeyebilirsiniz. Yerdeyse, deseni değiştirebilirsiniz.

Bu arada, karakter gizliyse, karakter nesnesini seçin ve denetçinin Sprite Renderer katman sırasını 2 olarak ayarlayın. Katmanların sırası varsayılan olarak 0'dır ve Tilemap 0'dır, bu nedenle bu değerin üzerine çıkarırsanız, ön planda görüntülenir.

Ardından TilemapObject'i seçin ve hareketsiz hale getirmek istediğiniz harita ipucunu yerleştirin. Önce katman sırasını 1 olarak ayarlayın. Bu, yerin önünde görünmesini sağlamaktır.

Toprağı gizlerseniz böyle görünür.

Tabii ki, bu noktada, çarpışma tespiti ile ilgili herhangi bir ayar yoktur, bu nedenle normal olarak yüksek zeminde sürebilirsiniz. Bundan sonra, çarpışma tespitini ayarlayacağız.

Çarpışma Algılama Ayarları

İlk olarak, karakteri ayarlayalım. Bu ayar aşağıdaki ipuçlarıyla neredeyse aynıdır, bu yüzden ayrıntıları atlayacağım ve prosedürü kısaca açıklayacağım.

Hiyerarşiden bir karakter nesnesi seçin ve Bileşen Ekle'den Fizik 2B -> Daire Çarpıştırıcısı 2B'yi seçin. Nesnenin şekli dikdörtgen ise, "Kutu Çarpıştırıcısı 2D" iyidir.

Benzer şekilde, "Physics 2D -> Rigidbody 2D" ekleyin.

Otomatik düşmeyi önlemek Rigidbody 2D için yerçekimi ölçeğini 0 olarak ayarlayın.

Hareketli grafiğin çarpışırken dönmesini önlemek için Kısıtlamalar altında Z'yi işaretleyin.

Ardından, vurmak istediğiniz "TilemapObject" i seçin ve "Bileşen Ekle" den "Tilemap -> Tilemap Collider 2D" yi seçin.

Hepsi bu kadar. Herhangi bir programlamaya bile ihtiyacınız yok. Oyunu çalıştırın ve duvar haline gelen nesneye vurmaya çalışın. Bence düzgün bir şekilde durduğundan emin olabilirsiniz.

Ancak, gerçekten vurduğunuzda, davranışta endişe verici noktalar olacağını düşünüyorum. İşte bazı çözümler:

Harita ve çözümlerle isabet tespitinin uygunsuz davranışı

Bir duvara çarptığınızda, sizi rahatsız eden birkaç şey bulabilirsiniz.

Duvara karşı hareket ederseniz, ortada kalırsınız

Box Collider 2D Bir nesne kullanıyorsanız bunun olacağını düşünüyorum.

Örneğin, aşağıdaki sahneden, sol alttaki tuşa bastığınızda, duvar boyunca sola doğru hareket etmesini istersiniz. Ancak, biraz ilerlemeden sonra, bir şeye sıkışıp kalacağını ve duracağını düşünüyorum.

Duvarlardaki ezikleri konuma göre tanıyın

Circle Collider 2D Bence eklerseniz anlamanın kolay olduğunu düşünüyorum. Duvar düz olmalıdır, ancak duvara doğru hareket ettirirseniz, duvarın düzensizmiş gibi hareket ettiğini göreceksiniz.

Takılmalara ve çarpmalara neden olan nedenler ve çözümler

Bunların oluşmasının nedeni "isabet tespitinin mapchip bazında yapılması" gibi görünüyor. Aslında, TilemapObject'i seçtiğinizde, isabet algılamanın bulunduğu yerde yeşil bir çizgi görünür ve bunun MapTip birimlerinde çizilmiş bir çizgi olduğunu görebilirsiniz.

Bu nedenle, hareketli nesne tam olarak bir harita yongasına eşdeğer bir çizgi üzerindeyse, bir harita çipi ile bir isabet olarak değerlendirilecektir. Harita çiplerinin sınırında çarpışırsanız, iki harita çipi vurulur ve yargılanır, böylece sıçramanın gücü artar.

Bence bu sorunu çözmenin en iyi yolu, isabet tespitini ekli harita çipleriyle birleştirmek. Bunu şu şekilde yapabilirsiniz:

Denetçiden isabet algılama ile "TilemapObject" i seçinTilemap Collider 2D ve .

Uyarıda belirtildiği gibi, bunun tek başına bir etkisi yoktur, bu nedenle "Bileşen Ekle" den "Fizik 2D -> Kompozit Çarpıştırıcı 2D" yi seçin.

Rigidbody 2D, Kompozit Çarpıştırıcı 2D ile birlikte eklenir.

Biraz kafa karıştırıcı, ancak isabet algılamalı harita çipleri arasındaki sınırdaki yeşil çizginin kaybolduğunu doğrulayabileceğinizi düşünüyorum.

Döşeme haritasının hareket etmesini istemiyorum, bu yüzden bileşen gövde türünü "statik" olarak bırakacağım Rigidbody 2D .

Şimdi oyunu çalıştırın ve hareket ettirmeye çalışın. Duvar boyunca çapraz olarak hareket etseniz bile, yakalanmayacağını ve engebeli hareket etmeden sorunsuz bir şekilde hareket edebileceğinizi düşünüyorum.

Duvarlardan geri itilen karakterleri ortadan kaldırın

Duvarı itmek için karakteri hareket ettirirseniz ve sonra hareket etmeyi bırakırsanız, duvardan geri sıçrayan gibi davranacağını görebilirsiniz.

Bunu çözmek için,Rigidbody 2D karakter nesnesini seçin ve bileşenden "Çarpışma algılama" yı "Sürekli" olarak değiştirin.

"Süreksiz" ve "sürekli" arasındaki fark aşağıdaki gibidir.

Kesintili

Çarpışma algılama, hareket ettikten sonra düşünen bir mekanizmadır. Hareket ettirildiği ve duvara gömüldüğü durumdan çarpışma tespiti yapan bir formdur. Trambolinler ve kauçuk ile ilişkilendirirseniz anlamak kolaydır, ancak ne kadar çok gömülürse, kuvvet o kadar itici olur ve sıçrama o kadar güçlü olur. Bunun yerine, hesaplama taşındıktan sonra gerçekleştirilir, bu nedenle işlem maliyeti düşüktür.

Devamlı

Yolda ne olduğu belirlenirken işlenir. Taşınma öncesi ve sonrası pozisyon arasında bir duvar olup olmadığını belirlemek, Bir duvar varsa, oradaki çarpışmayı yargılayacak ve duracaktır, bu yüzden pratikte itme yoktur. Bunun yerine, hesaplama hareketin ortasına dahil edildiğinden işlem maliyeti biraz artar.

Bir harita nesnesinin köşesinde yakalandı

Programa ve konuma bağlı olarak, bazıları yakalanır ve bazıları yakalanmaz ve nedeni çok fazla değişmemiştir. Bu arada, Box Collider 2D gibi açısal köşelerle olur, yuvarlak dairelerle değil.

Böyle gizemli bir fenomen meydana gelse bile, takılmaları önlemek için çarpıştırıcının yuvarlatılmış köşelerine sahip olmak iyidir. Box Collider 2D ile sınırlıdır, ancak yuvarlak hale getirmek için karakter nesnesinin Box Collider 2D bileşeninin bir "kenar yarıçapı" vardır ve oraya bir değer koyarsınız. Sayısal birim olarak 1 girerseniz, nesne boyutu için yuvarlama gerçekleşir. Boyuta bağlıdır, ancak yaklaşık 0.1 koymak iyidir.

Bu arada, isabet kararı sadece yuvarlaklığın boyutuna göre artar, bu yüzden lütfen büyükse ayarlayın. Box Collider 2D, düğmeyi tıklatarak doğrudan görünümde yeniden boyutlandırmanıza olanak tanıyan bir Çarpıştırıcı Düzenle düğmesine sahiptir. Dış yeşil çizgi gerçek isabet algılama olduğundan, boyutu doğal olmayacak şekilde ayarlayın.

Bundan sonra, çizilmediğinden emin olmak için oyunu çalıştırın ve ayarlamalar yapın.