Pengendalian Perlanggaran dengan Fizik Standard (2D)

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2021.3.3F1
Pakej Sistem Input
  • 1.3.0

Prasyarat untuk petua ini

Tetapan berikut telah dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Pada mulanya

Petua ini meletakkan dua objek supaya anda boleh melaksanakan tingkah laku memanipulasi satu objek dan menggunakan fizik standard Unity untuk menolak yang lain apabila ia bersentuhan dengan yang lain.

Dengan cara ini, kebanyakan tetapan adalah sama seperti prosedur yang diterangkan dalam artikel sebelumnya "Menentukan sama ada objek bertembung antara satu sama lain (2D)".

Penyediaan

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

Selepas membuat projek, sediakan dua imej sprite yang akan menjadi objek dan tambahkannya. Nama-nama itu masing-masing adalah "UnityTips" dan "UnityTips_2".

Tambah dua imej fail dengan menjatuhkannya ke dalam pandangan.

Tambah skrip untuk mengalihkan objek kiri dengan papan kekunci. Nama Player skripnya ialah .

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 objek yang anda ingin jalankan skrip.

Jalankan permainan dan semak sama ada ia berfungsi dengan kekunci kursor pada papan kekunci anda.

Akhirnya, letakkan objek teks untuk memaparkan status pengesanan perlanggaran. Nama TextState objek ialah .

Seting Pengendalian Perlanggaran

Dari sini, anda boleh mengkonfigurasi tetapan yang berkaitan dengan perlanggaran.

Mula-mula, pilih objek yang ingin anda alihkan, "Petua Perpaduan", dan klik "Tambah Komponen" dari pemeriksa. Pilih daripada Physics 2D senarai. Physics adalah objek 3D, jadi jangan salah.

Physics 2DBox Collider 2D Pilih daripada . Oleh kerana sprite ini adalah segi empat tepat, Kotak dipilih, tetapi jika berbentuk bulatan, contohnya, pilih bentuk lain seperti Bulatan.

Kali terakhir, saya ingin mendapatkan maklumat hanya mengenai sama ada saya memukulnya atau tidak, jadi saya menyemak "Jadikannya pencetus", tetapi kali ini saya tidak akan. Ini membolehkan pengendalian perlanggaran dalam fizik.

Rigidbody 2D Kemudian tambah komponen . Anda boleh menambahnya daripada "Fizik 2D -> Rigidbody 2D". Rigidbody memberikan maklumatCollider fizik kepada objek dan juga boleh menentukan perlanggaran dengan objek yang mempunyai .

Tetapkan Skala Graviti kepada 0 untuk mengelakkan kejatuhan bebas di bawah.

Begitu juga, tambah komponen pada objek lain "UnityTips_2" untuk menandakan Box Collider 2D hits.

Di samping itu, kali ini adalah perlu untuk bergerak dengan kekuatan lawan,Rigidbody 2D jadi tambah . Skala graviti hendaklah 0.

Itu sahaja yang ada padanya. Tiada program diperlukan pada masa ini. Jalankan permainan dan cuba sentuh objek lain.

Saya fikir anda boleh mengesahkan bahawa jika anda menolak lawan seperti ini, lawan akan berkelakuan seolah-olah dia ditolak. Ia sangat mudah untuk menggunakan fizik fungsi standard kerana tiada program diperlukan.

Mengelakkan objek berputar

Anda boleh melihat apabila anda menyentuhnya, tetapi jika titik hit beralih sedikit, setiap objek akan berputar. Sebagai permainan, ia sering menjadi tidak wajar, jadi anda perlu menetapkannya supaya ia tidak berputar.

Rigidbody 2D Komponen ini mempunyai item yang dipanggil "Putaran tetap" dalam "Kekangan", jadi semak Z. Sekarang anda boleh bekerja supaya ia tidak berputar. Cuba tetapkannya kepada dua objek dan jalankan permainan untuk menyemaknya.

Saya fikir anda boleh yakin bahawa ia tidak berputar tidak kira apa sudut yang anda tolak.

Lakukan sesuatu apabila objek memukul satu sama lain

Sebagai contoh, anda mungkin mahu melaksanakan peluru yang memukul musuh sambil menolak lawan sambil mengurangkan kesihatan musuh. Ini sama seperti petua sebelumnya , kerana peristiwa itu akan berlaku, jadi anda boleh menanganinya.

Player Buka skrip dan tambah setiap medan dan kaedah menggunakan seperti 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}";
  }
}

Oleh kerana kami ingin memaparkan maklumat mengenai sama ada ia dipukul atau tidak, kami akan membolehkannya memaparkannya dalam objek teks seperti berikut.

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

Proses pengesanan perlanggaran diterangkan seperti 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}";
}

Sama seperti petua sebelumnya------, tetapi nama kaedah kini "OnCollision------2D" dan bukannya "OnTrigger2D".

Rigidbody 2D Setiap peristiwa di atas berlaku apabila objek yang telah bertembung dengan objek Collider 2D lain yang mempunyai . Ini akan membolehkan anda menentukan dan memproses sama ada ia betul atau tidak.

Terdapat tiga peristiwa, masing-masing dipanggil pada masa berikut.

OnCollisionEnter2D Apabila objek memukul satu sama lain
OnCollisionStay2D Semasa objek memukul satu sama lain
OnCollisionExit2D Apabila objek meninggalkan keadaan perlanggaran

Dalam kedua-dua kes, objek lawan menerima objek lawan sebagai hujah, jadi anda boleh mendapatkan objek lawan Collision2D dengan mencari Collider2D.gameObject jenis sasaran yang dipukul oleh (musuh, item, Collider2D.collider.tag dll.).

Daripada tiga peristiwa di OnCollisionEnter2D atas, dan OnCollisionExit2D dipanggil sekali setiap perlanggaran.

OnCollisionStay2D dipanggil setiap bingkai semasa perlanggaran, tetapi peristiwa itu tidak lagi dipanggil selepas masa tertentu telah berlalu kerana kedua-dua objek berhenti. Ini kerana ia dianggap telah memasuki keadaan tidur, dan ia dianggap sebagai pembaziran pemprosesan untuk mengira perlanggaran setiap bingkai dengan sesuatu yang tidak bergerak.

Jika anda Rigidbody 2D tidak mahu tidur, tukar mod tidur parameter kepada "Jangan tidur".

Selepas mengubah kod, tetapkan teks untuk memaparkan maklumat.

Jalankan permainan dan gerakkan objek dengan papan kekunci untuk menyentuh sprite lain. Anda dapat melihat bahawa tiga fungsi dipanggil untuk setiap satu.

Dengan cara ini, jika anda menyentuh objek dan kemudian berhenti bergerak, kaedah itu akan dipanggil untuk OnCollisionStay2D masa yang singkat. Anda sepatutnya dapat melihat bahawa kaedah itu tidak lagi dipanggil selepas OnCollisionStay2D masa tertentu.

Ini menunjukkan bahawa anda telah memasuki keadaan tidur, tetapi jika anda ingin menukar masa sehingga anda memasuki tidur ini, anda boleh mengubahnya dengan memilih "Fizik 2D" dari tetapan projek dan menentukan parameter "Masa tidur" dalam beberapa saat. Ia tidak boleh ditetapkan kepada 0, tetapi jika ia OnCollisionStay2D ditetapkan kepada kecil tak terhingga, kaedah itu sendiri tidak akan dipanggil.