반응형
코드를 살펴보다가 Action 사용하는 코드 부분을 보고 궁금증이 생겨서 공부를 했다.
임시로 `키를 눌렀을때 setting UI가 활성화되는 코드를 가져왔다.
코드
// PlayerController.cs
public class PlayerController : MonoBehaviour
{
// 생략
public Action setting;
public void OnPreferenceButton(InputAction.CallbackContext context)
{
if (context.phase == InputActionPhase.Started)
{
setting?.Invoke();
}
}
// 생략
}
// UIPreference.cs
public class UIPreference : MonoBehaviour
{
public GameObject settingWindow;
private PlayerController controller;
void Start()
{
controller = CharacterManager.Instance.Player.controller;
controller.setting += Toggle;
settingWindow.SetActive(false);
}
public void Toggle()
{
if (settingWindow.activeInHierarchy)
{
settingWindow.SetActive(false);
}
else
{
settingWindow.SetActive(true);
}
}
public bool IsOpen()
{
return settingWindow.activeInHierarchy;
}
}
코드를 살펴보면서 이런 궁금증이 생겼는데,
Q. setting?.Invoke();을 썼을뿐인데 어디서 뭐가 호출돼서 UI를 껐다 켰다 할 수 있는거지?
이렇게 Unity Event로는 입력 이벤트만 있었는데 내가 궁금해 한 것 처럼 setting이 Invoke되는게 왜 SetActive되는거랑 상관 있는거지? 싶었다.
A. UIPreference 클래스의 controller.setting += Toggle; 코드가 PlayerController의 setting 이벤트에 Toggle 함수 구독하는 코드이다.
Action은 Delegate의 일종으로 매개변수가 없고 반환 값도 없는 메서드를 참조할 수 있는 델리게이트 타입이다.
PlayerController 클래스에서 Action 델리게이트를 사용하여 setting 이벤트를 정의해서,
setting 이벤트가 발생할 때 구독된 모든 메서드가 호출되는 것이다.
그렇기 때문에 UIPreference 클래스의 Toggle()이 setting을 사용할때 불리는것이다.
그렇게되면 Toggle의 SetActive 기능이 실행되는 것이다.
오늘의 회고
기본적인 내용을 모르고 넘어갔던 것 같아서 자아성찰을 하게됐다.
사용법도 간단하고 코드 분리할때 편할 것 같아서 자주 사용할 듯 싶다.
반응형
'Record > TIL' 카테고리의 다른 글
[Unity] UI 위에 오브젝트 표시되게 하기 (0) | 2024.06.05 |
---|---|
[Unity] 3D 맵 제작 (2D 타일맵을 이용하여 제작하기) (7) | 2024.06.04 |
[Unity] Find 함수 장단점 (0) | 2024.05.31 |
[Unity] 낮일때는 회복되고 밤일때는 소모되는 UI 만들기 (0) | 2024.05.30 |
[Unity] 플랫폼 발사대 (포물선으로 튕겨내기) (4) | 2024.05.29 |