Susidūrimo su standartine fizika valdymas (2D)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2021.3.3F1
Įvesties sistemos paketas
  • 1.3.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Iš pradžių

Šis patarimas įdeda du objektus, kad galėtumėte įgyvendinti manipuliavimo vienu objektu elgesį ir naudoti "Unity" standartinę fiziką, kad stumtumėte kitą, kai jis liečiasi su kitu.

Beje, dauguma nustatymų yra tokie patys, kaip aprašyta ankstesniame straipsnyje "Nustatymas, ar objektai susiduria vienas su kitu (2D)".

Paruošimas

Procedūra čia yra beveik tokia pati kaip ir ankstesniuose patarimuose , todėl tekėkime sklandžiai.

Sukūrę projektą, paruošite du "sprite" vaizdus, kurie bus objektai, ir pridėkite juos. Pavadinimai yra atitinkamai "UnityTips" ir "UnityTips_2".

Pridėkite du vaizdo failus numesdami juos į rodinį.

Pridėkite scenarijų, kad klaviatūra perkeltumėte kairįjį objektą. Scenarijaus pavadinimas Player yra .

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

Pridėkite prie objekto, kuriame norite paleisti scenarijų.

Paleiskite žaidimą ir patikrinkite, ar jis veikia su klaviatūros žymeklio klavišais.

Galiausiai įdėkite tekstinį objektą, kad būtų rodoma susidūrimo aptikimo būsena. Objekto pavadinimas TextState yra .

Susidūrimo valdymo nustatymai

Čia galite konfigūruoti su susidūrimais susijusius nustatymus.

Pirmiausia pasirinkite objektą, kurį norite perkelti, "UnityTips" ir iš inspektoriaus spustelėkite "Pridėti komponentą". Pasirinkite iš Physics 2D sąrašo. Physics yra 3D objektas, todėl nesuklyskite.

Physics 2DBox Collider 2D Pasirinkite iš . Kadangi šis sprite yra stačiakampis, pasirenkamas langelis, bet jei jis yra apskritimo formos, pavyzdžiui, pasirinkite kitas figūras, pvz., Apskritimas.

Praėjusį kartą norėjau gauti informacijos tik apie tai, ar pataikiau, ar ne, todėl patikrinau "Make it trigger", bet šį kartą to nepadarysiu. Tai leidžia valdyti susidūrimus fizikoje.

Rigidbody 2D Tada pridėkite komponentus . Jį galite pridėti iš "Physics 2D -> Rigidbody 2D". Rigidbody suteikia objektui fizikos informacijąCollider ir taip pat gali nustatyti susidūrimus su objektais, kurie turi .

Nustatykite gravitacijos skalę į 0, kad išvengtumėte laisvo kritimo žemiau.

Panašiai pridėkite komponentą prie kito objekto "UnityTips_2", kad pažymėtumėte Box Collider 2D įvykius.

Be to, šį kartą būtina judėti priešininko jėga,Rigidbody 2D todėl pridėkite . Gravitacijos skalė turėtų būti 0.

Tai viskas, kas yra. Šiuo metu nereikia jokios programos. Paleiskite žaidimą ir pabandykite paliesti kitą objektą.

Manau, galite patvirtinti, kad jei taip stumdysite priešininką, priešininkas elgsis taip, lyg jis būtų stumiamas. Labai paprasta naudoti standartinės funkcijos fiziką, nes nereikia jokios programos.

Neleiskite objektams suktis

Galite pamatyti, kai jį paliesite, bet jei smūgio taškas pasislinks net šiek tiek, kiekvienas objektas pasisuks. Kaip žaidimas, jis dažnai tampa nenatūralus, todėl jį reikia nustatyti taip, kad jis nesisuktų.

Rigidbody 2D Komponente yra elementas, vadinamas "Fiksuotas sukimas" skiltyje "Apribojimai", todėl patikrinkite Z. Dabar galite dirbti taip, kad jis nesisuktų. Pabandykite nustatyti jį į du objektus ir paleiskite žaidimą, kad jį patikrintumėte.

Manau, galite būti tikri, kad jis nesisuka, nesvarbu, iš kokio kampo jį stumiate.

Darykite ką nors, kai objektai atsitrenkia vienas į kitą

Pavyzdžiui, galbūt norėsite įdiegti kulką, kuri pataiko į priešą stumdama priešininką, tuo pačiu sumažindama priešo sveikatą. Tai yra tas pats, kaip ir ankstesni patarimai, nes įvykis įvyks, todėl galite su juo susidoroti.

Player Atidarykite scenarijų ir pridėkite kiekvieną lauką bei metodą taip:

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

Kadangi norime rodyti informaciją apie tai, ar jis nukentėjo, ar ne, suteiksime galimybę jį rodyti teksto objekte taip.

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

Susidūrimo aptikimo procesas aprašomas taip:

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

Panašus į ankstesnius patarimus------, tačiau metodo pavadinimas dabar yra "OnCollision------2D", o ne "OnTrigger2D".

Rigidbody 2D Kiekvienas iš pirmiau minėtų įvykių įvyksta, kai objektas, susidūręs su kitu objektu Collider 2D , turinčiu . Tai leis jums nustatyti ir apdoroti, ar jis teisingas, ar ne.

Yra trys įvykiai, kurių kiekvienas vadinamas tokiu laiku.

OnCollisionEnter2D Kai objektai atsitrenkia vienas į kitą
OnCollisionStay2D Kol objektai atsitrenkia vienas į kitą
OnCollisionExit2D Kai objektai palieka susidūrimo būseną

Abiem atvejais priešininko objektas gauna priešininko objektą kaip argumentą, todėl priešininko Collision2D objektą galite gauti ieškodami Collider2D.gameObject taikinio tipo (priešas, Collider2D.collider.tag daiktas ir kt.).

OnCollisionEnter2D minėtų trijų įvykių ir OnCollisionExit2D yra iškviečiami vieną kartą per susidūrimą.

OnCollisionStay2D susidūrimo metu vadinamas kiekvienas kadras, tačiau įvykis nebevadinamas praėjus tam tikram laikui nuo tada, kai abu objektai sustojo. Taip yra todėl, kad manoma, kad jis pateko į miego būseną, ir tai laikoma apdorojimo švaistymu, norint apskaičiuoti kiekvieno kadro susidūrimą su kažkuo, kas nejuda.

Rigidbody 2D Jei nenorite, kad jis miegotų, pakeiskite parametro miego režimą į "Nemiegoti".

Pakeitę kodą, nustatykite informacijos rodymo tekstą.

Paleiskite žaidimą ir perkelkite objektą klaviatūra, kad paliestumėte kitą sprite. Matote, kad kiekvienai iš jų reikalingos trys funkcijos.

Beje, jei paliesite objektą ir nustosite judėti, metodas bus iškviestas OnCollisionStay2D trumpą laiką. Turėtumėte matyti, kad po tam tikro laiko metodas nebėra vadinamas OnCollisionStay2D .

Tai rodo, kad įvedėte miego būseną, bet jei norite pakeisti laiką, kol įvesite šį miegą, galite jį pakeisti projekto nustatymuose pasirinkę "2D fizika" ir sekundėmis nurodydami parametrą "Miego laikas". Jis negali būti nustatytas į 0, bet jei jis OnCollisionStay2D yra be galo mažas, pats metodas nebus vadinamas.