5주차 1교시 / 이론과 설명

막는 충돌,
감지하는 Trigger

4주차에는 벽이 Player를 막았습니다. 이제 같은 Collider가 겹침을 허용하면서 수집, 위험, 목표라는 사건을 보내는 구조를 배웁니다.

왼쪽에서는 주황색 플레이어가 단단한 벽에 멈추고, 오른쪽에서는 청록색 Trigger 영역을 통과하며 초록색 수집물 사건을 발생시키는 장면
접촉의 두 결과 같은 접촉 후보도 Is Trigger와 Layer 규칙에 따라 물리적 차단 또는 겹침 사건이 됩니다.

1교시의 도착점

학생은 Unity를 따라 조작하지 않습니다. 교수자의 장면 시연과 코드 판독을 보며 접촉이 사건으로 바뀌는 조건과 흐름을 설명합니다.

  • 형식교수자 이론과 시연
  • 핵심 구분Collision / Trigger
  • 학생 활동예측 / 코드 추적
  • 01

    Collision과 Trigger가 움직임에 주는 결과를 구분합니다.

  • 02

    2D Trigger callback에 필요한 Collider2D와 Rigidbody2D 조건을 설명합니다.

  • 03

    OnTriggerEnter2D(Collider2D other)의 parameter가 무엇을 가리키는지 읽습니다.

  • 04

    Layer, Tag, Sorting Layer가 각각 물리 필터, 정체성, 그림 순서를 담당함을 구분합니다.

  1. 4주차 회수

    Rigidbody2D와 Collider2D가 Player와 Wall에서 맡았던 책임을 복원합니다.

  2. 접촉 성립 조건

    Collider 형상, Rigidbody2D, Layer 규칙이 만나는 순서를 봅니다.

  3. Collision과 Trigger

    물리적 분리와 겹침 callback의 차이를 같은 장면에서 비교합니다.

  4. Trigger 생명주기

    Enter, Stay, Exit 중 이번 주에 필요한 Enter의 의미를 구분합니다.

  5. 상대 식별

    Layer, Tag, CompareTag와 other parameter를 하나의 판단으로 연결합니다.

  6. 코드 시연과 회수

    값을 바꾸기 전에 결과를 예측하고 세 질문으로 개념을 회수합니다.

겹쳐 보인다고 바로 사건이 되지는 않습니다

Trigger callback이 오기까지 네 개의 문을 통과합니다. 이 흐름을 알면 “코드는 맞는데 반응하지 않는다”는 문제를 Inspector와 Project Settings에서 나누어 찾을 수 있습니다.

형상Collider2D

두 GameObject에 접촉을 계산할 2D 형상이 있어야 합니다.

움직임Rigidbody2D

Trigger 이벤트를 보내려면 두 Collider 중 적어도 한쪽에 Rigidbody2D가 있어야 합니다.

필터Layer Matrix

두 Layer 조합의 접촉이 Project Settings에서 허용되어야 합니다.

방식Is Trigger

꺼져 있으면 물리 충돌, 켜져 있으면 겹침과 callback이 됩니다.

이번 수업의 표준 구성

4주차 Player에는 이미 Rigidbody2D와 Collider2D가 있습니다. 따라서 수집물, 위험, 목표 오브젝트에는 Collider2D를 붙이고 Is Trigger를 켜는 것만으로 Trigger 쪽에 별도 Rigidbody2D를 추가하지 않아도 됩니다.

Retrieval 01

Player가 통과하면서 수집 사건을 보내야 한다면?

원하는 물리 결과를 기준으로 선택합니다.

Collision은 공간을 지키고, Trigger는 사건을 알립니다

둘 다 Collider2D의 형상을 사용하지만 목적이 다릅니다. 물리적 벽과 상호작용 구역을 같은 방식으로 설정하면 레벨의 의미가 흐려집니다.

Collision / Is Trigger Off

겹침을 해결합니다

물리 엔진이 Collider가 서로 파고들지 않도록 위치와 속도를 해결합니다. 벽, 바닥, 움직일 수 없는 장애물에 사용합니다.

Trigger / Is Trigger On

겹침을 허용하고 알립니다

물리적 차단은 하지 않고 Enter, Stay, Exit callback을 보냅니다. 수집물, 위험 구역, 목표 지점에 사용합니다.

ENTER경계에 들어온 순간

OnTriggerEnter2D. 한 번 발생해야 하는 수집, 리셋, 목표 판정에 적합합니다.

STAY안에 머무는 동안

OnTriggerStay2D. 물리 step마다 반복됩니다. 이번 주의 일회성 사건에는 사용하지 않습니다.

EXIT경계에서 나온 순간

OnTriggerExit2D. 구역 효과 해제처럼 떠나는 시점이 필요할 때 사용합니다.

한 번 수집할 일을 Stay에 두지 않습니다

Player가 Trigger 안에 여러 physics step 머무르면 Stay는 반복 호출됩니다. 카운트가 빠르게 여러 번 증가할 수 있으므로 이번 주 수집, 위험, 목표는 Enter를 기본으로 사용합니다.

Unity가 접촉 정보를 parameter로 건넵니다

Trigger가 다른 Collider와 겹치면 Unity가 정확한 이름과 형태의 event function을 호출합니다. 우리는 직접 호출하지 않고, 전달된 other를 읽어 누구인지 판단합니다.

Trigger event signature / 설명용
private void OnTriggerEnter2D(Collider2D other)
{
    Debug.Log(other.name);
}
  • private void외부에 결과를 반환하지 않는 event function입니다. Unity가 이름과 parameter 형태를 보고 호출합니다.
  • OnTriggerEnter2D2D Trigger 경계에 다른 Collider가 들어온 순간을 나타냅니다. 3D 함수 이름과 섞지 않습니다.
  • Collider2D other이번 접촉에 들어온 상대 Collider를 가리킵니다. 상대의 이름, Tag, Component를 확인하는 출발점입니다.
  • other.name시연 중 어떤 GameObject가 들어왔는지 Console에서 확인합니다. 실제 판단은 이름 문자열보다 Tag와 Component를 사용합니다.
Retrieval 02

2D Trigger callback의 최소 물리 구성은?

두 오브젝트를 합친 조건입니다.

Layer는 만남을 거르고, Tag는 상대를 확인합니다

둘은 비슷해 보이지만 질문이 다릅니다. Layer는 물리 엔진이 접촉을 계산할지 정하고, Tag는 callback 안에서 상대의 의미를 확인합니다.

Layer

누구와 접촉할 수 있는가?

Player, Environment, Interaction처럼 물리 그룹을 나눕니다. Layer Collision Matrix가 허용하지 않으면 callback 이전에 접촉 후보가 제거됩니다.

Tag

들어온 상대는 누구인가?

Player처럼 GameObject의 역할을 표시합니다. callback에서 CompareTag로 빠르고 명확하게 확인합니다.

Sorting Layer

무엇이 앞에 그려지는가?

Sprite Renderer의 화면 표시 순서입니다. 물리 접촉 여부나 Trigger callback에는 영향을 주지 않습니다.

Component

어떤 능력을 가지고 있는가?

TryGetComponent로 상대에게 필요한 Script가 실제로 붙어 있는지 확인하고, 성공했을 때만 그 기능을 호출합니다.

Identity guard / Player만 통과
if (!other.CompareTag("Player"))
{
    return;
}

!는 논리값을 반대로 바꿉니다. “Player Tag와 같은가?”가 false라면 !false는 true가 되어 즉시 돌아갑니다. 따라서 아래쪽 수집 코드는 Player에게만 실행됩니다.

Retrieval 03

물리 접촉 필터와 상대 역할 확인의 올바른 조합은?

Layer와 Tag의 책임을 고릅니다.

수집물 하나의 사건 흐름을 끝까지 읽습니다

아래 코드는 교수자 시연용 최소 예시입니다. 아직 수집 개수를 저장하지 않고, Player가 들어오면 한 번 기록한 뒤 수집물을 비활성화합니다.

Collectible.cs / 교수자 시연 완성본
using UnityEngine;

public class Collectible : MonoBehaviour
{
    private bool collected;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (collected)
        {
            return;
        }

        if (!other.CompareTag("Player"))
        {
            return;
        }

        collected = true;
        Debug.Log(name + " 수집 완료");
        gameObject.SetActive(false);
    }
}
  1. collected이미 처리한 수집물인지 기억합니다. 같은 사건이 겹쳐 들어와도 한 번만 처리하는 방어선입니다.
  2. CompareTag("Player")들어온 상대가 Player 역할인지 확인합니다. 다른 Trigger나 오브젝트는 즉시 건너뜁니다.
  3. collected = true화면을 숨기기 전에 상태를 먼저 기록합니다. 코드의 의도를 분명하게 만듭니다.
  4. SetActive(false)수집물 GameObject를 비활성화해 화면과 물리 접촉에서 제거합니다. Prefab Asset 자체는 사라지지 않습니다.

시연에서 확인할 장면

  1. Is Trigger 끄기

    Player가 수집물에 막히고 Trigger callback은 발생하지 않는 차이를 보여 줍니다.

  2. Player Rigidbody2D의 Simulated 끄기

    필수 물리 구성이 깨졌을 때 callback이 오지 않는 상황을 비교합니다.

  3. Layer 조합 끄기

    코드는 그대로지만 Matrix에서 접촉을 막으면 사건이 사라지는 것을 보여 줍니다.

  4. Tag 바꾸기

    접촉은 성립하지만 코드의 역할 확인에서 return되는 차이를 보여 줍니다.

한 사건을 원인 순서로 설명합니다

학생은 화면을 보지 않고 다음 흐름을 말합니다. 교수자는 용어 암기보다 순서와 책임의 연결이 맞는지 확인합니다.

01형상

두 Collider2D가 공간에서 겹칩니다.

02물리와 필터

Rigidbody2D 조건과 Layer Matrix를 통과합니다.

03Callback

Unity가 OnTriggerEnter2D에 other를 전달합니다.

04판단과 결과

Tag를 확인하고 수집물 상태를 바꿉니다.

Unity 6.6 공식 문서

수업에서는 핵심 관계만 쉬운 언어로 설명합니다. 정확한 callback 조건과 API 의미는 아래 공식 문서에서 확인합니다.

질문이 남았다면

“Collectible의 Is Trigger는 켜져 있고 Player에 Rigidbody2D가 있습니다. 접촉은 되지만 CompareTag에서 return되는 것 같습니다”처럼 확인한 조건과 멈춘 지점을 함께 말합니다.