Menu
CoddyTech

UnityEvent 필드

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 12번째.

버튼의 On Click ()은 UnityEvent 필드이며, 직접 작성한 스크립트에도 같은 필드를 만들 수 있습니다. public UnityEvent 필드는 Inspector에 같은 종류의 목록으로 표시되고, 스크립트는 무엇이 연결되어 있는지 알 필요 없이 Invoke()로 이벤트를 발생시킵니다. 이 카운트다운은 1초마다 한 번씩 작동합니다:

using UnityEngine;
using UnityEngine.Events;

public class Countdown : MonoBehaviour
{
    public int seconds = 3;
    public UnityEvent<int> onTick;
    public UnityEvent onFinished;

    void Start()
    {
        InvokeRepeating("Tick", 1f, 1f);
    }

    void Tick()
    {
        seconds--;
        onTick.Invoke(seconds);
        if (seconds == 0)
        {
            CancelInvoke("Tick");
            onFinished.Invoke();
        }
    }
}

Inspector에서 On Finished ()에는 버튼처럼 행을 추가할 수 있습니다. 한 행은 로켓을 발사하고, 다른 행은 게이트를 엽니다. 다른 레벨에서는 같은 Countdown을 다른 행과 함께 재사용하므로 새 스크립트를 작성할 필요가 없습니다. UnityEvent<int>는 값을 전달합니다. 드롭다운에서 int를 받는 메서드는 Dynamic int 아래에 표시되며, 해당 행은 Invoke에 전달된 값, 여기서는 남은 초를 받습니다. 같은 메서드를 Static Parameters 아래에서 선택하면 행에 직접 입력한 숫자를 전달하며, 매개변수가 없는 메서드도 연결할 수 있습니다.

Unity는 스크립트를 로드할 때 UnityEvent 필드를 생성하므로 onTick은 null이 될 일이 없고 ?.도 필요하지 않습니다. 코드에서 onTick.AddListener(ShowSeconds)로 리스너를 추가할 수도 있습니다. 반응이 오브젝트마다 다르고 Inspector에서 설정할 때는 UnityEvent를 선택하세요. 직접 설정하거나 스크립트를 열지 않는 디자이너가 설정할 수 있습니다. 코드가 리스너를 등록할 때는 C# 이벤트를 선택하세요. 컴파일러가 메서드 이름을 확인하므로 이름을 바꾸면 조용히 <Missing> 행이 남는 대신 빌드가 실패하며, C# 이벤트는 Inspector에 표시되지 않습니다.

challenge icon

챌린지

쉬움

섬 주변을 세 바퀴 도는 경주입니다. 화살표로 자동차를 운전하고(Car.cs), 디자이너가 Inspector에서 설정하듯 장면을 연결해 두었습니다. FinishLine의 On Lap (Int32) 목록은 LapText의 LapBoard.ShowLaps(동적 int)와 Crowd의 Crowd.Cheer를 호출하고, On Race Over () 목록은 LapBoard.ShowFinished와 Car.Stop을 호출합니다. 스크립트는 준비되어 있지만, FinishLine에 이벤트가 있어야 목록에 연결할 항목이 생깁니다.

FinishLine.cs를 작성하세요.

  • UnityEvent 필드 두 개를 만드세요. int를 전달하는 onLap과 아무것도 전달하지 않는 onRaceOver입니다.
  • 자동차(Player 태그)가 결승선을 지날 때마다 한 바퀴를 완주합니다. 완주한 바퀴 수(1, 2, 3)를 전달해 onLap을 호출하세요. 결승선을 지나는 다른 대상은 횟수에 포함하지 않습니다.
  • 완주한 바퀴 수가 laps(3)에 도달하면 onRaceOver를 호출하세요. 그 후에는 결승선을 지나도 아무 일도 일어나지 않습니다.

Play를 누르고 섬 주변을 세 바퀴 운전한 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

public class FinishLine : MonoBehaviour
{
    public int laps = 3;

    void OnTriggerEnter(Collider other)
    {
        // 자동차가 결승선을 통과했습니다: 한 바퀴를 더 돌았습니다
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨