Определяне дали обектите се сблъскват един с друг (2D)
Среда за проверка
- Уиндоус
-
- Прозорци 11
- Редактор на единство
-
- 2021.3.3f1
- Пакет на входната система
-
- 1.3.0
Предпоставки за този съвет
Следните настройки са направени предварително като предпоставка за описанието на този съвет.
Отначало
Този съвет обяснява как да определите дали два обекта са в контакт. Преместване на един обект с клавиатурата.
Подготовка
След като създадете проекта, подгответе две изображения на спрайта, който ще бъде обектът. Ако ви е трудно да се подготвите, можете да поставите два еднакви спрайта, но този път ще ги разделим за яснота. Имената са съответно "UnityTips" и "UnityTips_2".
Добавете два файла с изображения, като ги пуснете в изгледа.
Добавете скрипт, за да преместите левия обект с клавиатурата. Името Player
на скрипта е .
Съдържанието на скрипта е подобно на съветите в Преместване, завъртане и мащабиране на спрайт.
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);
}
}
}
Прикачете към обекта, върху който искате да изпълните скрипта.
Стартирайте играта и проверете дали работи с клавишите на курсора на клавиатурата.
И накрая, поставете текстов обект, за да покажете състоянието на откриване на сблъсък.
Името на TextState
обекта е .
Настройки за управление на сблъсък
От тук можете да конфигурирате настройките, свързани с сблъсъци.
Първо, изберете обекта, който искате да преместите, "UnityTips" и кликнете върху "Добавяне на компонент" от инспектора.
Изберете от Physics 2D
списъка. Physics
е 3D обект, така че не се заблуждавайте.
Physics 2D
Box Collider 2D
Изберете от . Тъй като този спрайт е правоъгълен, Box е избран, но ако е с кръгла форма, например, изберете други фигури като Circle.
Box Collider 2D
Тъй като компонентът ще бъде добавен, проверете "Make it trigger" от параметрите.
Това ще ви позволи да получите информация само за това "дали сте ударили или не".
Rigidbody 2D
След това добавете компонентите на . Можете да го добавите от "Физика 2D -> Rigidbody 2D".
Rigidbody
дава физика информацияCollider
на обекта и също може да определи сблъсъци с обекти, които имат .
Rigidbody
Ако обаче имате компонент, той ще съдържа и гравитационна информация в посока -Y, така че ако го изпълните, той ще падне.
Така че задайте "Гравитационната скала" на 0 от параметрите.
Между другото, ако това е екшън игра със странично превъртане, може да е удобно да използвате гравитационната скала в смисъл, че е свободно падане.
По същия начин добавете компонент към Box Collider 2D
другия обект "UnityTips_2".
Това е засегнатата страна този път, така че не е нужно да променяте никакви настройки.
Player
Отворете скрипта и добавете всяко поле и метод, като използвате следното:
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}";
}
}
Тъй като искаме да покажем информация за това дали е бил ударен или не, ще направим възможно показването му в текстов обект, както следва.
<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}";
}
Rigidbody 2D
Всяко от горните събития се случва, когато обект, който се сблъска с друг обект Collider 2D
, който има .
Това ще ви позволи да определите и обработите дали е правилно или не.
Има три събития, всяко от които се нарича в следния момент.
OnTriggerEnter2D | Когато обектите се удрят един друг |
OnTriggerStay2D | Докато обектите се удрят един друг |
OnTriggerExit2D | Когато обектите напуснат състоянието на сблъсък |
И в двата случая противниковият обект получава обекта на противника като аргумент, така че можете да получите обекта на противникаCollider2D
, като потърсите Collider2D.gameObject
вида на целта, ударена от (враг, Collider2D.tag
предмет и т.н.).
От OnTriggerEnter2D
горните три събития, и OnTriggerExit2D
се наричат веднъж на сблъсък.
OnTriggerStay2D
се нарича всеки кадър по време на сблъсъка, но събитието вече не се извиква след като е изминало известно време, откакто и двата обекта са спрели.
Това е така, защото се счита, че е влязъл в състояние на сън и се счита за загуба на обработка, за да се изчислят сблъсъците на всеки кадър с нещо, което не се движи.
Rigidbody 2D
Ако не искате да спи, променете режима на заспиване на параметъра на "Не спи".
След като промените кода, задайте текста за показване на информация.
Стартирайте играта и преместете обекта с клавиатурата, за да докоснете друг спрайт. Можете да видите, че за всяка се извикват три функции.
Между другото, ако докоснете обект и след това спрете да се движите, методът ще бъде извикан за OnTriggerStay2D
кратко време.
Трябва да можете да видите, че методът вече не се извиква след OnTriggerStay2D
определен период от време.
Това показва, че сте въвели състояние на заспиване, но ако искате да промените времето, докато влезете в този сън, можете да го промените, като изберете "2D физика" от настройките на проекта и зададете параметъра "Време на сън" в секунди.
Той не може да бъде настроен на 0, но ако OnTriggerStay2D
е настроен на безкрайно малък, самият метод няма да бъде извикан.