Nosakiet, vai objekti saduras viens ar otru (2D)
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 izskaidro, kā noteikt, vai divi objekti saskaras. Pārvietojiet vienu objektu ar tastatūru.
Gatavošana
Pēc projekta izveidošanas sagatavojiet divus sprite attēlus, kas būs objekts. Ja jums ir apgrūtinoši sagatavoties, varat ievietot divus identiskus sprites, bet šoreiz skaidrības labad mēs tos atdalīsim. 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 .
Skripta saturs ir līdzīgs padomiem sadaļā Pārvietot, pagriezt un mērogot sprite.
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
// スプライトの移動処理
// Translate メソッドでスプライトの位置が移動します
// Space.World を指定すると回転の影響をうけません
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 2D
Box 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.
Box Collider 2D
Tā kā komponents tiks pievienots, no parametriem atzīmējiet "Make it trigger".
Tas ļaus jums iegūt informāciju tikai par to, "vai jūs trāpījāt vai nē".
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 .
Rigidbody
Tomēr, ja jums ir komponents, tas saturēs arī gravitācijas informāciju -Y virzienā, tādēļ, ja to izpildīsit, tas nokritīs.
Tātad iestatiet "Gravitācijas skalu" uz 0 no parametriem.
Starp citu, ja tā ir sānu ritināšanas darbības spēle, var būt ērti izmantot gravitācijas skalu tādā nozīmē, ka tā ir brīva krišana uz leju.
Līdzīgi pievienojiet komponentu Box Collider 2D
otram objektam "UnityTips_2".
Šoreiz šī ir skartā puse, tāpēc jums nav jāmaina iestatījumi.
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 OnTriggerEnter2D(Collider2D partner)
{
TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
TextState.text = $"OnTriggerExit2D : {partner.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 OnTriggerEnter2D(Collider2D partner)
{
TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
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ā.
OnTriggerEnter2D | Kad priekšmeti trāpa viens otram |
OnTriggerStay2D | Kamēr priekšmeti sitas viens pret otru |
OnTriggerExit2D | 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 Collider2D
objektu, meklējot Collider2D.gameObject
mērķa veidu, kuru skāra (ienaidnieks, Collider2D.tag
priekšmets utt.).
No iepriekš minētajiem trim notikumiem un OnTriggerExit2D
tiek izsaukti OnTriggerEnter2D
vienu reizi vienā sadursmē.
OnTriggerStay2D
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 OnTriggerStay2D
īsu laiku.
Jums vajadzētu būt iespējai redzēt, ka metode pēc noteikta laika vairs netiek izsaukta OnTriggerStay2D
.
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 OnTriggerStay2D
ir iestatīts uz bezgalīgi mazu, pati metode netiks saukta.