Sadursmes risināšana ar standarta fiziku (2D)

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2021.3.3f1
Ievades sistēmas pakete
  • 1.3.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Sākumā

Šis padoms novieto divus objektus, lai jūs varētu īstenot uzvedību, manipulējot ar vienu objektu un izmantojot Unity standarta fiziku, lai virzītu otru, kad tas nonāk saskarē ar otru.

Starp citu, lielākā daļa iestatījumu ir tādi paši kā iepriekšējā rakstā aprakstītā procedūra "Nosakot, vai objekti saduras viens ar otru (2D)".

Gatavošana

Procedūra šeit ir gandrīz tāda pati kā iepriekšējie padomi , tāpēc plūdīsim to vienmērīgi.

Pēc projekta izveidošanas sagatavojiet divus sprite attēlus, kas būs objekti, un pievienojiet tos. Nosaukumi ir attiecīgi "UnityTips" un "UnityTips_2".

Pievienojiet divus attēlu failus, nometot tos skatā.

Pievienojiet skriptu, lai pārvietotu kreiso objektu ar tastatūru. Skripta nosaukums Player ir .

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

Pievienojiet objektam, kuram vēlaties palaist skriptu.

Palaidiet spēli un pārbaudiet, vai tā darbojas ar tastatūras kursora taustiņiem.

Visbeidzot, novietojiet teksta objektu, lai parādītu sadursmes noteikšanas statusu. Objekta nosaukums TextState ir .

Sadursmes apstrādes iestatījumi

No šejienes jūs varat konfigurēt iestatījumus, kas saistīti ar sadursmēm.

Vispirms atlasiet objektu, kuru vēlaties pārvietot, "UnityTips" un no inspektora noklikšķiniet uz "Pievienot komponentu". Atlasiet no Physics 2D saraksta. Physics ir 3D objekts, tāpēc nekļūdieties.

Physics 2DBox Collider 2D Atlasīt no . Tā kā šis sprite ir taisnstūrveida, tiek atlasīts lodziņš, bet, ja tas ir, piemēram, apļa formas, atlasiet citas formas, piemēram, Aplis.

Pagājušajā reizē es gribēju iegūt informāciju tikai par to, vai es to trāpīju vai nē, tāpēc es pārbaudīju "Make it trigger", bet šoreiz es to nedarīšu. Tas nodrošina sadursmju apstrādi fizikā.

Rigidbody 2D Pēc tam pievienojiet komponentus no . To var pievienot no "Physics 2D -> Rigidbody 2D". Rigidbody sniedz fizikas informācijuCollider objektam un var arī noteikt sadursmes ar objektiem, kuriem ir .

Iestatiet gravitācijas skalu uz 0, lai novērstu brīvu kritienu zemāk.

Līdzīgi pievienojiet komponentu otram objektam "UnityTips_2", lai atzīmētu Box Collider 2D trāpījumus.

Turklāt šoreiz ir nepieciešams pārvietoties ar pretinieka spēku,Rigidbody 2D tāpēc pievienojiet . Gravitācijas skalai jābūt 0.

Tas ir viss, kas tam ir. Šobrīd nav nepieciešama neviena programma. Palaidiet spēli un mēģiniet pieskarties citam objektam.

Es domāju, ka jūs varat apstiprināt, ka, ja jūs iespiežat pretinieku šādi, pretinieks uzvedīsies tā, it kā viņš būtu stumts. Standarta funkcijas fiziku ir ļoti viegli izmantot, jo nav nepieciešama programma.

Objektu rotēšanas nepieļaušana

Jūs varat redzēt, kad tam pieskaraties, bet, ja trāpījuma punkts pat nedaudz mainās, katrs objekts pagriezīsies. Kā spēle tā bieži kļūst nedabiska, tāpēc jums tas jāiestata tā, lai tas negrieztos.

Rigidbody 2D Komponentam sadaļā "Ierobežojumi" ir vienums ar nosaukumu "Fiksēta rotācija", tāpēc pārbaudiet Z. Tagad jūs varat strādāt tā, lai tas negrieztos. Mēģiniet to iestatīt uz diviem objektiem un palaist spēli, lai to pārbaudītu.

Es domāju, ka jūs varat būt pārliecināti, ka tas negriežas neatkarīgi no tā, no kāda leņķa jūs to nospiežat.

Dariet kaut ko, kad priekšmeti trāpa viens otram

Piemēram, jūs varat ieviest lodi, kas trāpa ienaidniekam, vienlaikus stumjot pretinieku, vienlaikus samazinot ienaidnieka veselību. Tas ir tāds pats kā iepriekšējie padomi , jo notikums notiks, lai jūs varētu to risināt.

Player Atveriet skriptu un pievienojiet katru lauku un metodi, izmantojot šādi:

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

Tā kā mēs vēlamies parādīt informāciju par to, vai tas tika sasniegts, mēs ļausim to parādīt teksta objektā šādi.

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

Sadursmes noteikšanas process ir aprakstīts šādi.

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

Līdzīgi kā iepriekšējos padomos------, bet metodes nosaukums tagad ir "OnCollision------2D", nevis "OnTrigger2D".

Rigidbody 2D Katrs no iepriekš minētajiem notikumiem notiek, kad objekts, kas ir saduras ar citu objektu Collider 2D , kuram ir . Tas ļaus jums noteikt un apstrādāt, vai tas ir pareizi vai nē.

Ir trīs notikumi, no kuriem katrs tiek saukts nākamajā laikā.

OnCollisionEnter2D Kad priekšmeti trāpa viens otram
OnCollisionStay2D Kamēr priekšmeti sitas viens pret otru
OnCollisionExit2D Kad objekti atstāj sadursmes stāvokli

Abos gadījumos pretinieka objekts saņem pretinieka objektu kā argumentu, lai jūs varētu iegūt pretinieka Collision2D objektu, meklējot Collider2D.gameObject mērķa veidu, kuru skāra (ienaidnieks, Collider2D.collider.tag priekšmets utt.).

No iepriekš minētajiem trim notikumiem un OnCollisionExit2D tiek izsaukti OnCollisionEnter2D vienu reizi vienā sadursmē.

OnCollisionStay2D sadursmes laikā tiek saukts par katru kadru, bet notikums vairs netiek izsaukts pēc tam, kad ir pagājis zināms laiks, kopš abi objekti apstājās. Tas ir tāpēc, ka tiek uzskatīts, ka tas ir nonācis miega stāvoklī, un tiek uzskatīts par apstrādes izšķiešanu, lai aprēķinātu sadursmes ar katru rāmi ar kaut ko, kas nepārvietojas.

Ja nevēlaties Rigidbody 2D , lai tas gulētu, mainiet parametra miega režīmu uz "Negulēt".

Pēc koda maiņas iestatiet tekstu informācijas parādīšanai.

Palaidiet spēli un pārvietojiet objektu ar tastatūru, lai pieskartos citam sprite. Jūs varat redzēt, ka katrai no tām ir nepieciešamas trīs funkcijas.

Starp citu, ja jūs pieskaraties objektam un pēc tam pārtraucat kustību, metode tiks izsaukta uz OnCollisionStay2D īsu laiku. Jums vajadzētu būt iespējai redzēt, ka metode pēc noteikta laika vairs netiek izsaukta OnCollisionStay2D .

Tas norāda, ka esat ievadījis miega stāvokli, bet, ja vēlaties mainīt laiku, līdz ieejat šajā miega režīmā, varat to mainīt, projekta iestatījumos atlasot "2D fizika" un norādot parametru "Miega laiks" sekundēs. To nevar iestatīt uz 0, bet, ja tas OnCollisionStay2D ir iestatīts uz bezgalīgi mazu, pati metode netiks saukta.