Penanganan Tabrakan dengan Fisika Standar (2D)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 2021.3.3f1
Paket Sistem Input
  • 1.3.0

Prasyarat untuk tip ini

Pengaturan berikut telah dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Pada awalnya

Tip ini menempatkan dua objek sehingga Anda dapat menerapkan perilaku memanipulasi satu objek dan menggunakan fisika standar Unity untuk mendorong yang lain ketika bersentuhan dengan yang lain.

Omong-omong, sebagian besar pengaturannya sama dengan prosedur yang dijelaskan dalam artikel sebelumnya "Menentukan apakah objek saling bertabrakan (2D)".

Persiapan

Prosedur di sini hampir sama dengan tips sebelumnya , jadi mari kita mengalirkannya dengan lancar.

Setelah membuat proyek, siapkan dua gambar sprite yang akan menjadi objek dan tambahkan. Namanya masing-masing adalah "UnityTips" dan "UnityTips_2".

Tambahkan dua file gambar dengan menjatuhkannya ke tampilan.

Tambahkan skrip untuk memindahkan objek kiri dengan keyboard. Nama Player skripnya adalah .

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

Lampirkan ke objek tempat Anda ingin menjalankan skrip.

Jalankan game dan periksa apakah itu berfungsi dengan tombol kursor pada keyboard Anda.

Terakhir, tempatkan objek teks untuk menampilkan status deteksi tabrakan. Nama TextState objeknya adalah .

Pengaturan Penanganan Tabrakan

Dari sini, Anda dapat mengonfigurasi pengaturan yang terkait dengan tabrakan.

Pertama, pilih objek yang ingin Anda pindahkan, "UnityTips", dan klik "Add Component" dari inspektur. Pilih dari Physics 2D daftar. Physics adalah objek 3D, jadi jangan salah.

Physics 2DBox Collider 2D Pilih dari . Karena sprite ini berbentuk persegi panjang, Box dipilih, tetapi jika berbentuk lingkaran, misalnya, pilih bentuk lain seperti Circle.

Terakhir kali, saya ingin mendapatkan informasi hanya tentang apakah saya memukulnya atau tidak, jadi saya memeriksa "Jadikan itu pemicu", tetapi kali ini saya tidak akan melakukannya. Ini memungkinkan penanganan tabrakan dalam fisika.

Rigidbody 2D Kemudian tambahkan komponen . Anda dapat menambahkannya dari "Physics 2D -> Rigidbody 2D". Rigidbody Memberikan informasiCollider fisika kepada objek dan juga dapat menentukan tabrakan dengan objek yang memiliki .

Atur Skala Gravitasi ke 0 untuk mencegah jatuh bebas di bawah.

Demikian pula, tambahkan komponen ke objek lain "UnityTips_2" untuk menandai Box Collider 2D hit.

Selain itu, kali ini perlu bergerak dengan kekuatan lawan,Rigidbody 2D jadi tambahkan . Skala gravitasi harus 0.

Itu saja yang ada untuk itu. Tidak ada program yang diperlukan saat ini. Jalankan game dan coba sentuh objek lain.

Saya pikir Anda dapat memastikan bahwa jika Anda mendorong lawan seperti ini, lawan akan berperilaku seolah-olah dia didorong. Sangat mudah untuk menggunakan fisika fungsi standar karena tidak ada program yang diperlukan.

Mencegah objek berputar

Anda dapat melihat ketika Anda menyentuhnya, tetapi jika titik tekan bergeser sedikit, setiap objek akan berputar. Sebagai permainan, sering menjadi tidak wajar, jadi Anda harus mengaturnya agar tidak berputar.

Rigidbody 2D Komponen memiliki item yang disebut "Rotasi tetap" di "Kendala", jadi periksa Z. Sekarang Anda dapat bekerja agar tidak berputar. Coba atur ke dua objek dan jalankan game untuk memeriksanya.

Saya pikir Anda dapat yakin bahwa itu tidak berputar tidak peduli dari sudut mana Anda mendorongnya.

Lakukan sesuatu ketika benda saling bertabrakan

Misalnya, Anda mungkin ingin menerapkan peluru yang mengenai musuh sambil mendorong lawan sambil mengurangi kesehatan musuh. Ini sama dengan tips sebelumnya , karena peristiwa itu akan terjadi, sehingga Anda bisa menghadapinya.

Player Buka skrip dan tambahkan setiap bidang dan metode menggunakan sebagai berikut:

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

Karena kami ingin menampilkan informasi tentang apakah itu dipukul atau tidak, kami akan memungkinkan untuk menampilkannya dalam objek teks sebagai berikut.

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

Proses deteksi tabrakan dijelaskan sebagai berikut.

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

Mirip dengan tips sebelumnya------, tetapi nama metodenya sekarang adalah "OnCollision------2D" alih-alih "OnTrigger2D".

Rigidbody 2D Masing-masing peristiwa di atas terjadi ketika suatu objek yang telah bertabrakan dengan objek Collider 2D lain yang memiliki . Ini akan memungkinkan Anda untuk menentukan dan memproses apakah itu benar atau tidak.

Ada tiga peristiwa, yang masing-masing dipanggil pada waktu berikut.

OnCollisionEnter2D Ketika benda saling bertabrakan
OnCollisionStay2D Sementara benda-benda saling memukul
OnCollisionExit2D Ketika objek meninggalkan status tabrakan

Dalam kedua kasus, objek lawan menerima objek lawan sebagai argumen, sehingga Anda bisa mendapatkan objek lawan Collision2D dengan mencari Collider2D.gameObject jenis target yang terkena (musuh, item, Collider2D.collider.tag dll.).

Dari ketiga peristiwa di OnCollisionEnter2D atas, dan OnCollisionExit2D disebut sekali per tabrakan.

OnCollisionStay2D disebut setiap frame selama tabrakan, tetapi peristiwa ini tidak lagi disebut setelah jangka waktu tertentu berlalu sejak kedua objek berhenti. Hal ini karena dianggap sudah memasuki kondisi sleep, dan dianggap membuang-buang pengolahan untuk menghitung tumbukan setiap frame dengan sesuatu yang tidak bergerak.

Jika Anda Rigidbody 2D tidak ingin tidur, ubah mode tidur parameter menjadi "Jangan tidur".

Setelah mengubah kode, atur teks untuk menampilkan informasi.

Jalankan game dan pindahkan objek dengan keyboard untuk menyentuh sprite lain. Anda dapat melihat bahwa tiga fungsi dipanggil untuk masing-masing.

Ngomong-ngomong, jika Anda menyentuh suatu benda dan kemudian berhenti bergerak, metode ini akan dipanggil untuk OnCollisionStay2D waktu yang singkat. Anda harus dapat melihat bahwa metode ini tidak lagi dipanggil setelah OnCollisionStay2D jangka waktu tertentu.

Ini menunjukkan bahwa Anda telah memasuki kondisi tidur, tetapi jika Anda ingin mengubah waktu hingga Anda memasuki tidur ini, Anda dapat mengubahnya dengan memilih "Fisika 2D" dari pengaturan proyek dan menentukan parameter "Waktu tidur" dalam hitungan detik. Itu tidak dapat diatur ke 0, tetapi jika OnCollisionStay2D diatur ke sangat kecil, metode itu sendiri tidak akan dipanggil.