Ütközéskezelés szabványos fizikával (2D)

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2021.3.3f1
Bemeneti rendszercsomag
  • 1.3.0

A tipp előfeltételei

A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.

Először

Ez a tipp két objektumot helyez el, így megvalósíthatja az egyik objektum manipulálásának viselkedését, és a Unity szabványos fizikáját használva a másik tolására, amikor a másikkal érintkezik.

Egyébként a legtöbb beállítás megegyezik az előző cikkben leírt eljárással: "Annak meghatározása, hogy az objektumok ütköznek-e egymással (2D)".

Előkészítés

Az eljárás itt szinte ugyanaz, mint az előző tippek , tehát folytassuk simán.

A projekt létrehozása után készítsen elő két sprite-képet, amelyek objektumok lesznek, és adja hozzá őket. A nevek "UnityTips" és "UnityTips_2".

Adjon hozzá két képfájlt úgy, hogy a nézetbe húzza őket.

Adjon hozzá egy szkriptet a bal oldali objektum billentyűzettel való mozgatásához. A szkript neve Player .

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

Csatolja ahhoz az objektumhoz, amelyen futtatni szeretné a parancsfájlt.

Futtassa a játékot, és ellenőrizze, hogy működik-e a billentyűzet kurzorbillentyűivel.

Végül helyezzen el egy szöveges objektumot az ütközésészlelés állapotának megjelenítéséhez. Az objektum neve TextState .

Ütközéskezelési beállítások

Itt konfigurálhatja az ütközésekkel kapcsolatos beállításokat.

Először válassza ki az áthelyezni kívánt objektumot, a "UnityTips" -t, majd kattintson az "Összetevő hozzáadása" gombra az ellenőrből. Physics 2D Válasszon a listából. Physics egy 3D-s objektum, ezért félreértés ne essék.

Physics 2DBox Collider 2D Válasszon a közül. Mivel ez a sprite téglalap alakú, a program kijelöli a Doboz elemet, de ha például kör alakú, jelöljön ki más alakzatokat, például a Kör alakzatot.

Legutóbb csak arról akartam információt kapni, hogy eltaláltam-e vagy sem, ezért bejelöltem a "Make it trigger" lehetőséget, de ezúttal nem fogok. Ez lehetővé teszi az ütközéskezelést a fizikában.

Rigidbody 2D Ezután adja hozzá a összetevőit. Hozzáadhatja a "Fizika 2D -> Rigidbody 2D" részből. Rigidbody fizikai információkatCollider ad az objektumnak, és meghatározhatja az ütközéseket olyan objektumokkal, amelyek .

Állítsa a gravitációs skálát 0-ra, hogy megakadályozza az alatta történő szabadesést.

Hasonlóképpen adjon hozzá egy összetevőt a másik "UnityTips_2" objektumhoz a lekérések megjelöléséhez Box Collider 2D .

Ezenkívül ezúttal az ellenfél erejével kell mozogni,Rigidbody 2D ezért adjunk hozzá . A gravitációs skálának 0-nak kell lennie.

Ennyi az egész. Jelenleg nincs szükség programra. Futtassa a játékot, és próbáljon meg megérinteni egy másik tárgyat.

Azt hiszem, megerősítheti, hogy ha így nyomja be az ellenfelet, az ellenfél úgy fog viselkedni, mintha lökdösték volna. Nagyon könnyű használni a standard függvény fizikáját, mert nincs szükség programra.

Objektumok elforgatásának megakadályozása

Láthatja, ha megérinti, de ha a találati pont akár csak kissé is eltolódik, minden objektum elfordul. Játékként gyakran természetellenessé válik, ezért úgy kell beállítania, hogy ne forogjon.

Rigidbody 2D Az összetevőnek van egy "Rögzített forgatás" nevű eleme a "Megszorítások" részben, ezért ellenőrizze a Z-t. Most már dolgozhat úgy, hogy ne forogjon. Próbálja meg két objektumra állítani, és futtassa a játékot az ellenőrzéshez.

Azt hiszem, biztos lehet benne, hogy nem forog, függetlenül attól, hogy milyen szögből tolja.

Tegyen valamit, amikor a tárgyak egymásnak ütköznek

Előfordulhat például, hogy olyan golyót szeretne alkalmazni, amely eltalálja az ellenséget, miközben meglöki az ellenfelet, miközben csökkenti az ellenség életerejét. Ez ugyanaz, mint az előző tippek , mivel az esemény bekövetkezik, így kezelheti.

Player Nyissa meg a szkriptet, és adja hozzá az egyes mezőket és metódusokat az alábbiak szerint:

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

Mivel információt szeretnénk megjeleníteni arról, hogy eltalálták-e vagy sem, lehetővé tesszük annak megjelenítését szöveges objektumban az alábbiak szerint.

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

Az ütközésérzékelési folyamat leírása a következő.

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

Az előző tippekhez hasonlóan------, de a metódus neve mostantól "OnCollision------2D" az "OnTrigger2D" helyett.

Rigidbody 2D A fenti események mindegyike akkor fordul elő, ha egy objektum ütközik egy másik Collider 2D , . Ez lehetővé teszi, hogy meghatározza és feldolgozza, hogy helyes-e vagy sem.

Három esemény van, amelyek mindegyikét a következő időzítéssel hívják meg.

OnCollisionEnter2D Amikor a tárgyak egymásnak ütköznek
OnCollisionStay2D Miközben a tárgyak egymásnak ütköznek
OnCollisionExit2D Amikor az objektumok elhagyják az ütközési állapotot

Mindkét esetben az ellenfél tárgya argumentumként fogadja az ellenfél objektumát, így az ellenfél objektumát Collision2D úgy kaphatod meg, hogy megkeresed Collider2D.gameObject az eltalált célpont típusát (ellenség, Collider2D.collider.tag tárgy stb.).

A fenti három esemény közül OnCollisionEnter2D , és OnCollisionExit2D ütközésenként egyszer hívják őket.

OnCollisionStay2D az ütközés során minden képkockát meghívnak, de az eseményt már nem hívják meg, miután egy bizonyos idő eltelt azóta, hogy mindkét objektum megállt. Ez azért van, mert úgy tekintik, hogy alvó állapotba lépett, és feldolgozási pazarlásnak tekintik, ha minden képkockát ütközésnek számítanak valamivel, ami nem mozog.

Ha Rigidbody 2D nem szeretné, hogy alvó állapotba kerüljön, módosítsa a paraméter alvó üzemmódját "Ne aludjon" értékre.

A kód megváltoztatása után állítsa be az információk megjelenítésére szolgáló szöveget.

Futtassa a játékot, és mozgassa az objektumot a billentyűzettel, hogy megérintsen egy másik sprite-ot. Láthatja, hogy mindegyikhez három függvény van meghívva.

Egyébként, ha megérint egy tárgyat, majd abbahagyja a mozgást, a módszert rövid időre hívják OnCollisionStay2D . Látnia kell, hogy a metódust egy bizonyos idő elteltével OnCollisionStay2D már nem hívják meg.

Ez azt jelzi, hogy alvó állapotba lépett, de ha módosítani szeretné az alvásba való belépésig eltelt időt, megváltoztathatja azt a "2D fizika" kiválasztásával a projekt beállításaiból, és másodpercben megadva az "Alvási idő" paramétert. Nem állítható 0-ra, de ha OnCollisionStay2D végtelenül kicsire van állítva, maga a módszer nem kerül meghívásra.