본문으로 건너뛰기
게임 프로젝트 기초집LESSON 09

판정 시스템: 올바른 분류·오분류·놓침을 한 번만 처리하기

난이도초급 프로젝트
예상 시간55분
선수지식8강 플레이어 입력과 분류

9강. 판정 시스템: 올바른 분류·오분류·놓침을 한 번만 처리하기

1. 이번 강의에서 해결할 문제​

한 택배가 Zone 경계와 MissZone에 연속으로 닿으면 점수와 목숨이 둘 다 바뀔 수 있습니다. 첫 판정만 성공하도록 택배가 해결 상태를 소유합니다.

2. 학습 목표​

3. 핵심 개념​

Collider2D Trigger는 접촉 사실을 전달할 뿐 점수 규칙을 소유하지 않습니다. SortZone은 허용 데이터와 택배 정의를 비교해 결과를 계산하고 PackageActor 이벤트로 알립니다. TryResolve가 false면 이미 처리된 택배입니다.

4. 단계별 실습​

C# · 파일 경로: Assets/_Project/Scripts/Gameplay/PackageOutcome.cs

PackageOutcome.cs
namespace DeliverySorter.Gameplay
{
public enum PackageOutcome { Correct, Wrong, Missed }
}

C# · PackageActor.cs에 추가

PackageActor.cs
using System;

public event Action<PackageActor, PackageOutcome> Resolved;
public bool IsResolved { get; private set; }

public bool TryResolve(PackageOutcome outcome)
{
if (IsResolved) return false;
IsResolved = true;
Resolved?.Invoke(this, outcome);
return true;
}

Initialize 시작에서 IsResolved = false;를 설정합니다.

C# · 파일 경로: Assets/_Project/Scripts/Gameplay/SortZone.cs

SortZone.cs
using DeliverySorter.Data;
using UnityEngine;

namespace DeliverySorter.Gameplay
{
public sealed class SortZone : MonoBehaviour
{
[SerializeField] private PackageDefinition acceptedDefinition;

private void OnTriggerEnter2D(Collider2D other)
{
if (!other.TryGetComponent(out PackageActor package) || package.Definition == null) return;
PackageOutcome outcome = package.Definition == acceptedDefinition
? PackageOutcome.Correct : PackageOutcome.Wrong;
package.TryResolve(outcome);
}
}
}

C# · 파일 경로: Assets/_Project/Scripts/Gameplay/MissZone.cs

MissZone.cs
using UnityEngine;
namespace DeliverySorter.Gameplay
{
public sealed class MissZone : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
if (other.TryGetComponent(out PackageActor package))
package.TryResolve(PackageOutcome.Missed);
}
}
}

Inspector 연결 작업: 각 SortZone에 정확한 PackageDefinition을 할당하고 모든 Zone Collider2D의 Is Trigger를 켭니다. Package Prefab에는 Collider2D와 Rigidbody2D 중 하나 이상의 물리 구성이 필요합니다.

테스트 작업: Zone을 겹쳐 같은 택배가 두 Trigger에 들어가도 이벤트가 한 번만 발생하는지 임시 로그로 확인합니다.

5. 코드가 동작하는 이유​

첫 Trigger만 IsResolved를 true로 바꾸고 이벤트를 발생시킵니다. 뒤의 Trigger는 false를 받아 아무 결과도 만들지 않습니다. Zone은 결과 종류만 정하고 점수·목숨 처리는 다음 GameSession이 맡습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

판정 시스템: 올바른 분류·오분류·놓침을 한 번만 처리하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1다음 중 “판정 시스템: 올바른 분류·오분류·놓침을 한 번만 처리하기”의 핵심 요약을 실제 상황에 맞게 적용한 것은 무엇인가요?
  2. 문제 2‘태그 문자열만 비교’ 상태에 관한 “판정 시스템: 올바른 분류·오분류·놓침을 한 번만 처리하기” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

9강. 판정 시스템: 올바른 분류·오분류·놓침을 한 번만 처리하기 미완료 상태