유니티에서 이벤트란 C#의 델리게이트(delegate)를 기반으로 하며, 게임 오브젝트나 컴포넌트 간의 상호작용을 쉽게 처리할 수 있게 해 준다.
- 델리게이트(delegate): 특정 메서드를 가리키는 포인터 역할을 하는 참조 타입
이벤트를 사용하면 함수를 직접 호출하는 것보다 게임 오브젝트 간 의존도를 낮출 수 있고, 상태를 보다 명확히 관리할 수 있게 된다.
C# 이벤트 사용법
예를 들어, 점수가 바뀌었을 때 점수 UI를 갱신해주는 기능을 만든다면 다음과 같이 이벤트를 사용할 수 있다.
public event Action OnScoreChanged;
public TextMeshProUGUI scoreText;
public int score;
void Start()
{
OnScoreChanged += UpdateUI; // 이벤트 연결
}
public void ChangeScore(int amount)
{
score += amount;
OnScoreChanged?.Invoke(); // 이벤트 호출
}
public void UpdateUI()
{
scoreText.text = score.ToString();
}
이렇게 되면 `ChangeScore()`을 호출할 때 OnScoreChanged 이벤트가 불리게 되어 UpdateUI가 실행된다.
이렇게 이벤트가 발생하면 실행되는 콜백 함수(Callback Function)를 이벤트 리스너(Event Listener)라고 한다.
즉, 이벤트를 구독(Subscribe)하고 있다가 해당 이벤트가 발생(Invoke)하면 미리 등록된 메서드(리스너)가 실행되는 것이다.
이벤트에 연결된 리스너를 제거할 때는 다음과 같이 사용하면 된다.
OnScoreChanged -= UpdateUI;
유니티 이벤트 사용법
동일한 기능을 `UnityEvent` 를 사용해서 구현할 수도 있다.
이렇게 되면 인스펙터에서 이벤트를 설정할 수 있어서, 코드 수정 없이 이벤트를 쉽게 연결할 수 있다는 장점이 있다.
위의 예시와 동일한 기능을 UnityEvent 를 사용해서 구현하면 다음과 같다.
using UnityEngine.Events;
public class NewMonoBehaviourScript : MonoBehaviour
{
public UnityEvent OnScoreChanged;
public TextMeshProUGUI scoreText;
public int score;
void Start()
{
OnScoreChanged.AddListener(UpdateUI); // 이벤트 연결
}
public void ChangeScore(int amount)
{
score += amount;
OnScoreChanged?.Invoke(); // 이벤트 호출
}
public void UpdateUI()
{
scoreText.text = score.ToString();
}
}
대체로 동일하지만 이벤트를 연결할 때 `AddListener()`를 사용한다는 점에서 다르다.
이벤트 리스너는 `RemoveListener()`를 사용하여 해제할 수 있다.
이렇게 이벤트를 연결하면, 위의 사진과 같이 인스펙터에서 NewMonoBehaviourScript 하위에 OnScoreChanged 이벤트가 생긴 것을 확인할 수 있다.
유니티에 내장된 이벤트 사용하기
유니티에서는 다양한 이벤트들을 기본적으로 제공해주고 있는데, 대표적으로 UI 버튼을 생성하면 붙어 있는 OnClick 이벤트가 있다.
이 OnClick 이벤트를 활용하여 인스펙터 상에서 이벤트를 연결하는 방법을 알아보자.
버튼을 생성하면 Button.cs 하위에 `On Click()` 이벤트가 있는 것을 확인할 수 있다.
+ 버튼을 눌러 새로운 이벤트 리스너를 추가할 수 있다.
이벤트 리스너로 등록할 함수가 있는 오브젝트를 선택해준다.
⊙ 버튼을 눌러서 목록에서 선택해도 되고, 하이어라키(Hierarchy) 상에서 드래그해서 갖고 와도 된다.
나는 위에서 구현한 NewMonoBehaviourScript 가 붙어 있는 GameObject를 가져와주었다.
그 다음은 이벤트에 어떤 함수를 연결해줄지 선택하면 된다.
나는 버튼을 누르면 점수가 변경되는 기능을 구현하고 싶어서, `ChangeScore()` 함수를 연결해주었다.
`ChangeScore()` 함수는 파라미터로 int 값을 받아오고 있기 때문에, 이렇게 인스펙터 상에서 값을 설정해줄 수 있다.
나는 버튼을 1회 누르면 점수가 3씩 올라가도록 만들고 싶어서 3을 입력했다.
이렇게 실행해보면, 버튼을 클릭할 때마다 점수가 3씩 오르고 그 값이 scoreText에 반영되는 것을 확인할 수 있다.
'개발 > Unity·C#' 카테고리의 다른 글
[유니티/C#] 디자인 패턴 (1) - 싱글톤 패턴(Singleton)으로 스크립트 쉽게 호출하기 (0) | 2025.03.25 |
---|---|
[유니티/C#] 씬(Scene) 이동하기 (0) | 2025.03.24 |
[유니티/C#] Enum(열거형) 사용하기 (0) | 2025.03.22 |
[C#] 포맷 텍스트(Format Text) 소개 (string.Format, ToString, $ 문자열 보간법) (0) | 2025.02.15 |
[유니티/C#] Scriptable Object(스크립터블 오브젝트) 활용하기 (0) | 2025.01.26 |