본문으로 건너뛰기
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 미완료 상태