Susidūrimo su standartine fizika valdymas (2D)
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 2D
Box 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.).
Iš 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.