Menu
CoddyTech

UnityEvent 필드

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

버튼의 ‘클릭 시()’는 UnityEvent 필드이며, 직접 만든 스크립트에도 같은 필드를 둘 수 있습니다. 공개 UnityEvent 필드는 인스펙터에 같은 종류의 목록으로 표시되고, 스크립트는 어떤 항목이 연결되어 있는지 몰라도 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();
        }
    }
}

인스펙터에서 ‘완료 시()’에는 버튼의 경우처럼 항목을 추가할 수 있습니다. 한 항목은 로켓을 발사하고, 다른 항목은 문을 엽니다. 다른 레벨에서는 같은 Countdown을 다른 항목과 함께 재사용하므로 새 스크립트를 작성할 필요가 없습니다. UnityEvent<int>는 값을 전달합니다. 드롭다운에서 int를 받는 메서드는 동적 int 아래에 표시되며, 해당 항목에는 Invoke에 전달된 값, 여기서는 남은 초가 전달됩니다. 정적 매개변수 아래에 있는 같은 메서드에는 항목에 직접 입력한 숫자가 전달되며, 매개변수가 없는 메서드도 연결할 수 있습니다.

Unity는 스크립트를 불러올 때 UnityEvent 필드를 생성하므로 onTick은 항상 null이 아니며 ?.도 필요하지 않습니다. 또한 코드에서 onTick.AddListener(ShowSeconds)를 사용해 리스너를 추가할 수 있습니다. 오브젝트마다 반응이 다르고, 스크립트를 열지 않는 디자이너나 당신이 인스펙터에서 반응을 설정한다면 UnityEvent를 선택하세요. 코드에서 리스너를 연결한다면 C# 이벤트를 선택하세요. 컴파일러가 메서드 이름을 확인하므로 이름을 바꾸면 조용히 <Missing> 항목이 남는 대신 빌드가 실패합니다. 또한 C# 이벤트는 인스펙터에 표시되지 않습니다.

challenge icon

챌린지

쉬움

장면의 행이 연결된 이벤트를 FinishLine에 제공하세요.

  1. using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver;와 완료한 랩 수를 저장할 private int 필드를 추가하세요.
  2. OnTriggerEnter에서 other에 Player 태그가 지정되어 있으면 랩 수를 세고, 완료한 랩 수를 인수로 onLap.Invoke를 호출하세요.
  3. laps에 도달하면 onRaceOver.Invoke()를 호출하세요. 그 후에는 결승선을 통과해도 아무 일도 일어나지 않습니다.

‘플레이’를 누르고 세 바퀴를 주행하세요. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

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

    void OnTriggerEnter(Collider other)
    {
        // 자동차가 결승선을 통과했다: 한 바퀴를 더 돌았다
    }
}

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

직접 연습해 보세요: Unity 플레이그라운드