Botsingsafhandeling met standaardfysica (2D)
Verificatieomgeving
- Ramen
-
- Voor Windows 11
- Unity Editor
-
- 2021.3.3f1
- Input systeem pakket
-
- 1.3.0
Vereisten voor deze tip
De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.
Eerst
Deze tip plaatst twee objecten zodat je het gedrag van het manipuleren van het ene object kunt implementeren en de standaardfysica van Unity kunt gebruiken om het andere te duwen wanneer het in contact komt met het andere.
Overigens zijn de meeste instellingen hetzelfde als de procedure die is beschreven in het vorige artikel "Bepalen of objecten met elkaar botsen (2D)".
Voorbereiding
De procedure hier is bijna hetzelfde als de vorige tips , dus laten we het soepel laten verlopen.
Nadat u het project hebt gemaakt, bereidt u twee sprite-afbeeldingen voor die objecten zullen zijn en voegt u deze toe. De namen zijn respectievelijk "UnityTips" en "UnityTips_2".
Voeg twee afbeeldingsbestanden toe door ze in de weergave neer te zetten.
Voeg een script toe om het linkerobject met het toetsenbord te verplaatsen. De scriptnaam Player
is .
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);
}
}
}
Koppel aan het object waarop u het script wilt uitvoeren.
Voer het spel uit en controleer of het werkt met de cursortoetsen op uw toetsenbord.
Plaats ten slotte een tekstobject om de botsingsdetectiestatus weer te geven.
De objectnaam TextState
is .
Instellingen voor botsingsafhandeling
Vanaf hier kunt u de instellingen met betrekking tot botsingen configureren.
Selecteer eerst het object dat u wilt verplaatsen, "UnityTips", en klik op "Component toevoegen" in de inspecteur.
Maak een keuze uit Physics 2D
de lijst. Physics
is een 3D-object, dus vergis je niet.
Physics 2D
Box Collider 2D
Kies uit . Aangezien deze sprite rechthoekig is, is Box geselecteerd, maar als deze bijvoorbeeld cirkelvormig is, selecteert u andere vormen zoals Cirkel.
De vorige keer wilde ik alleen informatie krijgen over of ik het wel of niet raak, dus ik heb "Make it trigger" aangevinkt, maar deze keer doe ik dat niet. Dit maakt botsingsafhandeling in de natuurkunde mogelijk.
Rigidbody 2D
Voeg vervolgens de componenten van . Je kunt het toevoegen vanuit "Physics 2D -> Rigidbody 2D".
Rigidbody
geeft natuurkundige informatieCollider
aan het object en kan ook botsingen bepalen met objecten die .
Stel de zwaartekrachtschaal in op 0 om een vrije val eronder te voorkomen.
Voeg op dezelfde manier een component toe aan het andere object "UnityTips_2" om treffers te markeren Box Collider 2D
.
Bovendien is het deze keer noodzakelijk om met de kracht van de tegenstander te bewegen,Rigidbody 2D
dus voeg toe . De zwaartekrachtschaal moet 0 zijn.
Dat is alles. Er is op dit moment geen programma vereist. Voer het spel uit en probeer een ander object aan te raken.
Ik denk dat je kunt bevestigen dat als je de tegenstander zo naar binnen duwt, de tegenstander zich zal gedragen alsof hij wordt geduwd. Het is heel gemakkelijk om de fysica van de standaardfunctie te gebruiken omdat er geen programma nodig is.
Voorkomen dat objecten roteren
Je kunt het zien wanneer je het aanraakt, maar als het raakpunt zelfs maar een beetje verschuift, zal elk object roteren. Als spel wordt het vaak onnatuurlijk, dus je moet het zo instellen dat het niet roteert.
Rigidbody 2D
De component heeft een item genaamd "Fixed rotation" in "Constraints", dus controleer Z.
Nu kunt u zo werken dat het niet roteert. Probeer het in te stellen op twee objecten en voer het spel uit om het te controleren.
Ik denk dat je er zeker van kunt zijn dat het niet draait, ongeacht vanuit welke hoek je het duwt.
Doe iets als voorwerpen elkaar raken
Je kunt bijvoorbeeld een kogel implementeren die een vijand raakt terwijl je de tegenstander duwt terwijl je de gezondheid van de vijand vermindert. Dit is hetzelfde als de vorige tips , omdat de gebeurtenis zal plaatsvinden, zodat je ermee om kunt gaan.
Player
Open het script en voeg elk veld en elke methode als volgt toe:
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}";
}
}
Omdat we informatie willen weergeven over het al dan niet raken ervan, maken we het mogelijk om het als volgt in een tekstobject weer te geven.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Het botsingsdetectieproces wordt als volgt beschreven.
<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}";
}
Vergelijkbaar met de vorige tips------, maar de methodenaam is nu "OnCollision------2D" in plaats van "OnTrigger2D".
Rigidbody 2D
Elk van de bovenstaande gebeurtenissen treedt op wanneer een object dat is gebotst met een ander object Collider 2D
dat .
Hiermee kunt u bepalen en verwerken of het correct is of niet.
Er zijn drie gebeurtenissen, die elk op het volgende tijdstip worden aangeroepen.
OnCollisionEnter2D | Wanneer objecten elkaar raken |
OnCollisionStay2D | Terwijl objecten elkaar raken |
OnCollisionExit2D | Wanneer objecten de botsingsstatus verlaten |
In beide gevallen ontvangt het object van de tegenstander het object van de tegenstander als argument, zodat je het object van Collision2D
de tegenstander kunt krijgen door het type doel op Collider2D.gameObject
te zoeken dat door wordt geraakt (vijand, item, Collider2D.collider.tag
enz.).
Van de OnCollisionEnter2D
bovenstaande drie gebeurtenissen, en OnCollisionExit2D
worden één keer per botsing genoemd.
OnCollisionStay2D
wordt tijdens de botsing elk frame aangeroepen, maar de gebeurtenis wordt niet meer aangeroepen nadat er een bepaalde tijd is verstreken sinds beide objecten zijn gestopt.
Dit komt omdat het wordt beschouwd als in een slaaptoestand en het wordt beschouwd als een verspilling van verwerking om botsingen elk frame te berekenen met iets dat niet beweegt.
Als u niet wilt dat het slaapt, wijzigt u Rigidbody 2D
de slaapmodus van de parameter in "Niet slapen".
Nadat u de code hebt gewijzigd, stelt u de tekst in voor het weergeven van informatie.
Voer het spel uit en verplaats het object met het toetsenbord om een andere sprite aan te raken. Je kunt zien dat er voor elk drie functies worden aangeroepen.
Trouwens, als u een object aanraakt en vervolgens stopt met bewegen, wordt de methode voor OnCollisionStay2D
een korte tijd aangeroepen.
Je zou moeten kunnen zien dat de methode na OnCollisionStay2D
een bepaalde tijd niet meer wordt aangeroepen.
Dit geeft aan dat u een slaapstand hebt ingevoerd, maar als u de tijd wilt wijzigen totdat u deze slaapstand invoert, kunt u deze wijzigen door "2D-fysica" te selecteren in de projectinstellingen en de parameter "Slaaptijd" in seconden op te geven.
Het kan niet worden ingesteld op 0, maar als het OnCollisionStay2D
is ingesteld op oneindig klein, wordt de methode zelf niet aangeroepen.