본문으로 건너뛰기
Unity C# 기초집LESSON 17

이벤트와 C# delegate

난이도초급
예상 시간45분
선수지식16강 데이터 에셋

17강. 이벤트와 C# delegate

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

GameSession이 HUD Text와 Spawner를 직접 찾아 수정하면 UI 교체와 테스트가 어렵습니다. 상태를 바꾼 쪽은 사건만 알리고 관심 있는 객체가 반응하게 만듭니다.

2. 학습 목표

3. 핵심 개념

delegate는 호출 가능한 메서드 형태이고 event는 외부에서 구독·해제만 허용하는 알림 통로입니다. 발행자는 구독자의 구체 타입을 몰라도 됩니다. 수명이 다른 MonoBehaviour는 비활성화될 때 구독을 해제해야 중복 호출을 막을 수 있습니다.

4. 단계별 실습

C# · 파일 경로: Assets/DeliverySorter/Scripts/Game/GameSession.cs의 멤버 추가

GameSession.cs
using System;
using UnityEngine;

public sealed class GameSession : MonoBehaviour
{
public event Action<int, int> ScoreAndLivesChanged;
public event Action<GameState> StateChanged;

// 기존 State, Score, Lives와 시작값은 유지합니다.

private void NotifySnapshot()
{
ScoreAndLivesChanged?.Invoke(Score, Lives);
StateChanged?.Invoke(State);
}

public void RegisterCorrect(PackageTypeData type)
{
if (State != GameState.Playing || type == null) return;
Score += type.Score;
NotifySnapshot();
}

public void RegisterFailure()
{
if (State != GameState.Playing) return;
Lives = Mathf.Max(0, Lives - 1);
if (Lives == 0) State = GameState.GameOver;
NotifySnapshot();
}
}

C# · 파일 경로: Assets/DeliverySorter/Scripts/UI/HUDPresenter.cs의 구독 추가

HUDPresenter.cs
[SerializeField] private GameSession session;

private void OnEnable()
{
session.ScoreAndLivesChanged += RenderNumbers;
session.StateChanged += RenderState;
}

private void OnDisable()
{
if (session == null) return;
session.ScoreAndLivesChanged -= RenderNumbers;
session.StateChanged -= RenderState;
}

private void RenderNumbers(int score, int lives)
{
scoreText.text = $"점수 {score:N0}";
livesText.text = $"목숨 {lives}";
}

private void RenderState(GameState state)
{
stateText.text = state == GameState.GameOver ? "게임 오버" : state.ToString();
}

5. 코드가 동작하는 이유

GameSession은 숫자와 상태가 바뀐 사실만 발행합니다. HUDPresenter는 이를 구독해 화면을 갱신하고, 나중에 사운드나 Spawner도 같은 상태 이벤트를 독립적으로 구독할 수 있습니다.

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

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

이벤트와 C# delegate 미니 퀴즈

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

0 / 2
  1. 문제 1“이벤트와 C# delegate”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“이벤트와 C# delegate”의 작업 기준으로 ‘람다로 구독하고 다른 람다로 해제’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

17강. 이벤트와 C# delegate 미완료 상태