Kokkupõrke käsitlemine standardfüüsikaga (2D)
Kontrollimise keskkond
- Windows
-
- Windows 11
- Ühtsuse toimetaja
-
- 2021.3.3f1
- Sisendsüsteemi pakett
-
- 1.3.0
Selle näpunäite eeltingimused
Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.
Alguses
See näpunäide asetab kaks objekti, et saaksite rakendada ühe objektiga manipuleerimise käitumist ja kasutada Unity standardset füüsikat, et suruda teist, kui see puutub kokku teisega.
Muide, enamik seadeid on samad, mida on kirjeldatud eelmises artiklis "Objektide üksteisega kokkupõrke (2D) kindlaksmääramine".
Ettevalmistus
Siinne protseduur on peaaegu sama, mis eelmised nõuanded , nii et lähme sujuvalt.
Pärast projekti loomist valmistage ette kaks spraidipilti, mis on objektid, ja lisage need. Nimed on vastavalt "UnityTips" ja "UnityTips_2".
Lisage kaks pildifaili, kukutades need vaatesse.
Lisage skript, et liigutada vasakut objekti klaviatuuriga. Skripti nimi Player
on .
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);
}
}
}
Manustage objektile, millel soovite skripti käivitada.
Käivitage mäng ja kontrollige, kas see töötab klaviatuuri kursoriklahvidega.
Lõpuks asetage kokkupõrke tuvastamise oleku kuvamiseks tekstiobjekt.
Objekti nimi TextState
on .
Kokkupõrke käsitsemise seaded
Siit saate konfigureerida kokkupõrgetega seotud seadeid.
Esiteks valige objekt, mida soovite liigutada, "UnityTips" ja klõpsake inspektorilt "Lisa komponent".
Valige loendist Physics 2D
. Physics
on 3D-objekt, nii et ärge tehke viga.
Physics 2D
Box Collider 2D
Valige . Kuna see sprait on ristkülikukujuline, on ruut valitud, kuid kui see on näiteks ringikujuline, valige muud kujundid, näiteks Ring.
Eelmisel korral tahtsin saada teavet ainult selle kohta, kas ma seda tabasin või mitte, nii et kontrollisin nuppu "Tee see päästikuks", kuid seekord ma seda ei tee. See võimaldab füüsikas kokkupõrke käsitlemist.
Rigidbody 2D
Seejärel lisage komponendid . Saate selle lisada jaotisest "Physics 2D -> Rigidbody 2D".
Rigidbody
annab objektile füüsikateavetCollider
ja võib määrata ka kokkupõrkeid objektidega, millel on .
Seadke gravitatsiooniskaala väärtuseks 0, et vältida vaba langemist allapoole.
Samamoodi lisage teisele objektile komponent "UnityTips_2", et märkida Box Collider 2D
tabamusi.
Lisaks on seekord vaja liikuda vastase jõuga,Rigidbody 2D
nii et lisage . Gravitatsiooniskaala peaks olema 0.
See on kõik, mis seal on. Praegu pole programmi vaja. Käivitage mäng ja proovige puudutada teist objekti.
Ma arvan, et võite kinnitada, et kui surute vastast niimoodi sisse, käitub vastane nii, nagu oleks teda surutud. Standardfunktsiooni füüsikat on väga lihtne kasutada, kuna programmi pole vaja.
Objektide pöörlemise takistamine
Näete, kui seda puudutate, kuid kui löögipunkt nihkub isegi veidi, pöörleb iga objekt. Mänguna muutub see sageli ebaloomulikuks, nii et peate selle seadistama nii, et see ei pöörleks.
Rigidbody 2D
Komponendil on üksus nimega "Fikseeritud pööramine" jaotises "Piirangud", seega kontrollige Z.
Nüüd saate töötada nii, et see ei pöörleks. Proovige seada see kahele objektile ja käivitada mäng selle kontrollimiseks.
Ma arvan, et võite olla kindel, et see ei pöörle, olenemata sellest, millise nurga alt te seda lükkate.
Tehke midagi, kui objektid üksteist tabavad
Näiteks võite soovida rakendada kuuli, mis tabab vaenlast, lükates samal ajal vastast, vähendades samal ajal vaenlase tervist. See on sama, mis eelmised näpunäited , kuna sündmus toimub, nii et saate sellega toime tulla.
Player
Avage skript ja lisage iga väli ja meetod, kasutades järgmist:
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}";
}
}
Kuna tahame kuvada teavet selle kohta, kas see tabas või mitte, võimaldame seda tekstiobjektis kuvada järgmiselt.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Kokkupõrke tuvastamise protsessi kirjeldatakse järgmiselt.
<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}";
}
Sarnaselt eelmistele näpunäidetele------, kuid meetodi nimi on nüüd "OnCollision------2D" asemel "OnTrigger2D".
Rigidbody 2D
Kõik ülaltoodud sündmused toimuvad siis, kui objekt, mis on kokku põrganud teise objektiga Collider 2D
, millel on .
See võimaldab teil kindlaks teha ja töödelda, kas see on õige või mitte.
On kolm sündmust, millest igaüks kutsutakse järgmisel ajal.
OnCollisionEnter2D | Kui objektid üksteist tabavad |
OnCollisionStay2D | Samal ajal kui objektid üksteist löövad |
OnCollisionExit2D | Kui objektid lahkuvad kokkupõrke olekust |
Mõlemal juhul saab vastase objekt argumendina vastase objekti, nii et saate vastase objekti, Collision2D
otsides üles Collider2D.gameObject
tabatud sihtmärgi tüübi (vaenlane, Collider2D.collider.tag
ese jne).
Ülaltoodud kolmest sündmusest OnCollisionEnter2D
ja OnCollisionExit2D
neid nimetatakse üks kord kokkupõrke kohta.
OnCollisionStay2D
nimetatakse kokkupõrke ajal igaks kaadriks, kuid sündmust ei kutsuta enam pärast teatud aja möödumist mõlema objekti peatumisest.
Seda seetõttu, et seda peetakse uneseisundisse sisenenuks ja seda peetakse töötlemise raiskamiseks, et arvutada iga kaadri kokkupõrked millegagi, mis ei liigu.
Kui te Rigidbody 2D
ei soovi, et see magaks, muutke parameetri unerežiim "Ära maga".
Pärast koodi muutmist määrake teabe kuvamiseks tekst.
Käivitage mäng ja liigutage objekti klaviatuuriga, et puudutada teist spraiti. Näete, et igaühe jaoks on vaja kolme funktsiooni.
Muide, kui puudutate objekti ja seejärel lõpetate liikumise, kutsutakse meetod lühikeseks OnCollisionStay2D
ajaks.
Teil peaks olema võimalik näha, et meetodit teatud aja pärast OnCollisionStay2D
enam ei kutsuta.
See näitab, et olete sisenenud uneolekusse, kuid kui soovite muuta aega, kuni sisestate selle une, saate seda muuta, valides projekti seadetest "2D füüsika" ja määrates parameetri "Uneaeg" sekundites.
Seda ei saa seada väärtusele 0, kuid kui see OnCollisionStay2D
on seatud lõpmata väikeseks, siis meetodit ise ei kutsuta.