Obravnavanje trkov s standardno fiziko (2D)
Okolje za preverjanje
- Windows
-
- Windows 11
- Urejevalnik enotnosti
-
- 2021.3.3f1
- Paket vhodnega sistema
-
- 1.3.0
Predpogoji za to konico
Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.
Sprva
Ta namig postavi dva predmeta, tako da lahko izvajate vedenje manipuliranja z enim predmetom in uporabo Unityjine standardne fizike, da potisnete drugega, ko pride v stik z drugim.
Mimogrede, večina nastavitev je enaka postopku, opisanem v prejšnjem članku "Ugotavljanje, ali predmeti trčejo med seboj (2D)".
Pripravka
Tukajšnja procedura je skoraj enaka prejšnjim nasvetom , zato ga tekoče pretočimo.
Po izdelavi projekta pripravite dve sprite sliki, ki bosta predmeti in jih dodajte. Imena so »UnityTips« oziroma »UnityTips_2«.
Dodajte dve slikovni datoteki tako, da jih spustite v pogled.
Dodajte skript, da premaknete levi predmet s tipkovnico. Ime skripta je 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);
}
}
}
Priložite k predmetu, na katerem želite zagnati skript.
Zaženite igro in preverite, ali deluje s tipkami kazalca na tipkovnici.
Končno postavite besedilni predmet, da prikažete stanje zaznavanja trkov.
Ime predmeta je TextState
.
Nastavitve za ravnanje s trčenjem
Od tod lahko konfigurirate nastavitve, povezane s trke.
Najprej izberite predmet, ki ga želite premakniti, »UnityTips« in od inšpektorja kliknite »Dodaj komponento«.
Izberite s Physics 2D
seznama. Physics
je 3D predmet, zato ne naredite napake.
Physics 2D
Box Collider 2D
Izberite iz . Ker je ta sprite pravokolen, je box izbran, če pa je kroga oblike, na primer izberite druge oblike, kot je Krog.
Zadnjič sem hotel dobiti informacije samo o tem, ali sem ga zadel ali ne, zato sem preveril "Naj bo sprožilec", tokrat pa ne bom. To omogoča ravnanje s trkom v fiziki.
Rigidbody 2D
Nato dodajte komponente programa . Lahko ga dodate iz "Fizika 2D -> Rigidbody 2D".
Rigidbody
daje fizikiCollider
informacije predmetu in lahko določi tudi trke s predmeti, ki imajo .
Nastavite gravitacijsko lestvico na 0, da preprečite prosti padec spodaj.
Podobno dodajte komponento drugemu predmetu "UnityTips_2" Box Collider 2D
za označevanje zadetkov.
Poleg tega je tokrat potrebno premikati s silo nasprotnika,Rigidbody 2D
zato dodajte . Gravitacijska lestvica bi morala biti 0.
To je vse, kar je tu. Trenutno ni potreben noben program. Zaženite igro in se poskusite dotakniti drugega predmeta.
Mislim, da lahko potrdiš, da se bo nasprotnik, če boš tako potisnil nasprotnika, obnašal, kot da je porinjena. Zelo enostavno je uporabiti fiziko standardne funkcije, ker ni potreben noben program.
Preprečevanje vrtenja predmetov
Ko se ga dotaknete, lahko vidite, a če se točka zadetka celo nekoliko premakne, se bo vsak predmet zavrtel. Kot igra pogosto postane nenaravna, zato jo morate nastaviti tako, da se ne vrti.
Rigidbody 2D
Komponenta ima element z imenom »Fiksno vrtenje« v »Omejitve«, zato preverite Z.
Zdaj lahko delaš tako, da se ne vrti. Poskusite ga nastavite na dva predmeta in zagon igre, da jo preverite.
Mislim, da si lahko prepričan, da se ne vrti ne glede na to, iz kakšnega kota ga potisneš.
Naredite nekaj, ko se predmeti zadenejo med seboj
Na primer, boste morda želeli izvajati kroglo, ki zadene sovražnika, medtem ko potiska nasprotnika, medtem ko zmanjšuje zdravje sovražnika. To je enako kot prejšnji nasveti, saj se bo dogodek zgodilo, tako da se lahko ukvarjate z njim.
Player
Odprite skript in dodajte vsako polje in metodo na naslednji način:
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}";
}
}
Ker želimo prikazati informacije o tem, ali je bil zadet ali ne, jih bomo omogočili, da jih prikažemo v besedilnem objektu na naslednji način.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Postopek zaznavanja trkov je opisan na naslednji način.
<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}";
}
Podobno kot prejšnji nasveti------, vendar je ime metode zdaj "OnCollision------2D" namesto "OnTrigger2D".
Rigidbody 2D
Vsak od zgoraj navedenih dogodkov se zgodi, ko predmet, ki je trk z drugim predmetom Collider 2D
, ki ima .
To vam bo omogočilo, da določite in obdelate, ali je pravilno ali ne.
Obstajajo trije dogodki, od katerih se vsak imenuje ob naslednjem času.
OnCollisionEnter2D | Ko se predmeti med seboj zadenejo |
OnCollisionStay2D | Medtem ko se predmeti udarjajo med seboj |
OnCollisionExit2D | Ko predmeti zapustijo stanje trka |
V obeh primerih nasprotnikov predmet prejme nasprotnikov predmet kot argument, Collision2D
Collider2D.gameObject
tako da lahko dobiš nasprotnikov predmet tako, da iščeš vrsto tarče, ki jo zadene (sovražnik, Collider2D.collider.tag
element itd.).
Od zgoraj navedenih OnCollisionEnter2D
treh dogodkov, OnCollisionExit2D
in se imenujejo enkrat na trk.
OnCollisionStay2D
se imenuje vsak okvir med trčenjem, vendar dogodek ni več poklican, potem ko je minilo določeno obdobje, odkar sta se oba predmeta ustavila.
To je zato, ker se šteje, da je vstopil v stanje spanja, in se šteje za odpadke predelave za izračun trkov vsak okvir z nečim, kar se ne premika.
Če ne želite Rigidbody 2D
spati, spremenite način spanja parametra v »Ne spi«.
Ko spremenite kodo, nastavite besedilo za prikaz informacij.
Zaženite igro in premaknite predmet s tipkovnico, da se dotaknete drugega šprica. Vidite lahko, da so za vsako poklicane tri funkcije.
Mimogrede, če se dotaknete predmeta in se nato prenehate premikati, OnCollisionStay2D
bo metoda poklicana za kratek čas.
Videti morate, da OnCollisionStay2D
metoda ni več poklicana po določenem času.
To pomeni, da ste vnesli stanje spanja, vendar če želite spremeniti čas, dokler ne vnesete tega spanja, ga lahko spremenite tako, da izberete »2D Physics« iz nastavitev projekta in določite parameter »Čas mirovanja« v nekaj sekundah.
Ni ga mogoče nastaviti na 0, OnCollisionStay2D
če pa je nastavljena na neskončno majhno, sama metoda ne bo imenovana.