UnityEvent 를 이용해서 다른 클래스에서 이벤트를 구독하고 특정 조건이 되었을시에 등록된 이벤트들을 모두 실행시킬 수 있게 하는 방법을 통한 함수의 제어

현재 사용하고 있던 popup 시스템과 별개로, 다른 팝업 시스템을 기반으로 하는 popup 창을 새롭게 추가해서 적용하다보니 손쉽게 기존에 존재하던 로직을 수정하지않고 사용하고 싶은 상황에서, 기본적으로 새롭게 추가하는 popup 시스템이 특정 클래스 내부에 존재하는 메서드를 통해서 해당 클래스를 보유한 오브젝트의 부모 Canvas 의 transform 을 받아와야 하는 상황이라 특정한 Canvas에 오브젝트를 자식으로 붙여놓고 해당 자식 오브젝트에서 GameManager 가 특정 상황이 되었을때 그 타겟 오브젝트에 있는 함수를 호출해야 하는 상황에서, 마치 유니티에서 Button에 함수를 등록하고 사용할 수 있듯이 특정 함수들을 Gamemanager에 등록해두고 특정 상황시에 등록된 모든 함수들을 호출할 수 있도록 만드는 과정에서 UnityEvent 를 이용하여서 구현하였다.

이 UnityEvent의 경우 c# 에 있는 delegate 의 특수한 형태인 Event 를 이용하는것으로 보이며 내부 구조를 보면 C# Event로 작성된 형태의 코드를 상속해서 부가적으로 유니티 엔진상이나 에디터 상에서 유용한 형태를 추가한 모습일 것으로 생각된다. 유니티 엔진에서 이벤트를 사용할때는 c# Event를 새롭게 작성하기보다는 UnityEvent 클래스를 이용하는것이 간편할 것이다.

 

 


---Unity Event에 대한 chatGPT 정보---

 

유니티에서 오브젝트의 인스펙터에서 특정한 경우에 메세지를 전달하고 싶다면, 유니티의 이벤트 시스템 중 하나인 "UnityEvent"를 사용할 수 있습니다. UnityEvent를 사용하면 인스펙터에서 이벤트를 설정하고 해당 이벤트가 발생했을 때 실행될 함수를 지정할 수 있습니다.

다음은 UnityEvent를 사용하여 인스펙터에서 이벤트를 설정하는 방법입니다:

  1. 우선, 이벤트가 발생할 오브젝트를 선택합니다.
  2. 해당 오브젝트의 스크립트에서 public으로 UnityEvent 변수를 선언합니다. 예를 들어:
    csharpCopy code
    using UnityEngine; using UnityEngine.Events; public class YourScript : MonoBehaviour { public UnityEvent yourEvent; // 이벤트를 발생시킬 함수 public void TriggerEvent() { yourEvent.Invoke(); } }
  3. Unity에서 해당 오브젝트의 인스펙터를 열고, 이벤트를 설정하고자 하는 오브젝트의 스크립트 컴포넌트를 찾습니다.
  4. 해당 스크립트 컴포넌트의 UnityEvent 필드에 원하는 함수를 드래그 앤 드롭하거나, 직접 함수를 추가할 수 있습니다.

이제 인스펙터에서 UnityEvent를 사용하여 특정한 경우에 메세지를 전달하고 원하는 동작을 실행시킬 수 있습니다. 이를 통해 버튼 형태가 아닌 다양한 오브젝트에서도 이벤트를 처리할 수 있습니다.

 


 

GameManager 클래스에 해당 UnityEvent 를 심으면, 인스펙터 상에서 아래와 같이 나타날것이고, 여기에 메세지를 받을 다른 클래스의 원하는 메서드들을 등록해두고 한번에 모두 메세지를 보내서 작업을 수행할 수 있다.

  Comments,     Trackbacks