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
0 / 2이벤트와 C# delegate 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
17강. 이벤트와 C# delegate 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.