Ütközéskezelés szabványos fizikával (2D)
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 2D
Box 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.