Unity

Unity) Event

Todah 2023. 10. 20. 20:59
반응형

 

 

Event 란?

 Events는 이벤트를 '발생 시키는 쪽'과 이벤트에 대해 '반응하는 쪽'으로 되어 있다.

 예를 들어서 한개의 채널이 있을 경우 이 채널에 존재하는 구독자들이 있다고 생각했을 때, 채널 주인이 글을 올렸을 때 구독자들에게는 채널장(이벤트 게재자)이 글을 올렸다고 알림이 가는 것 처럼 알려주는 것을 이벤트라고 생각하면 된다. 

 

 확실히 이벤트를 알고 잘 사용해야지 스파게티 코드가 되는 것을 최대한 막아준다는 것을 느꼈다.

 

- UnityEvent 처리하는 방법

using UnityEngine.Events; // 요즘은 VSCode에서 자동으로 참조해준다.

...

public UnityEvent inspectors;
static internal UnityEvent scripts = new UnityEvent();

inspectors UnityEvent가 public 타입이므로 Unity 인스펙터에 UnityEvent 라는 타입을 노출시킨다.

scripts UnityEvent에 스크립트를 통해 Event를 등록하고 싶다면

동작을 연결하고 싶은 .cs 코드에서 scriptEvents를 접근해야한다.

 

- 사용자정의이벤트.AddListener(_함수명_)

인스펙터에 이벤트를 끌어다 놓는 작업과 동일하다.

 

- 사용자정의이벤트.RemoveListener(_함수명_)

- 사용자정의이벤트.RemoveAllListener(_함수명_)

이벤트의 연결을 제거하고 싶을 때 사용한다.

 

 

- 왜 UnityEvent를 사용하는가?

UnityEvent를 통해 이와같은 무지막지한 참조를 막아준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Scene_Loader : MonoBehaviour
{
    public UnityEvent PlayAgainEvent;
    public UnityEvent QuitEvent;
    
    public void OnClickPlayAgainButton(){
        Time.timeScale = 1;
        SceneManager.LoadScene(0);
    }

    public void OnClickQuitButton(){
        Time.timeScale = 1;
        Application.Quit();
    }
    
    public void PlayerScoreReset(){
        ...
    }
    
    public void EnemyLevelChange(){
        ...
    }
    
    ... // 위 이벤트 말고도 수많은 이벤트가 추가되어있다.
}

 실제로 위와 같이 게임을 다시 시작하는 이벤트나 게임을 종료하는 이벤트에는 수많은 상호작용이 서로 얽히기 마련이다.

여기서 UnityEvent를 사용하지 않는다면 갑작스런 수정이 필요한 경우에 얽힌부분을 모두 해결하는데 많은 시간이 필요하다. 따라서 많은 분기를 만들어내는 이벤트인경우에는 UnityEvent를 사용하는것이 바람직하다고 생각한다.

 

 

사용자가 정리하기 쉽다. 하지만 아래와 같은 장단점이 있으니 참고하자.

 

Inspector를 통한 직접연결 동적연결
실행순서를 보장받는다 🟢 실행순서를 보장받지 못한다.. ❌
런타임에 따라 순서 바뀜
Public 함수만 연결
Private로 은닉된 함수는 연결 불가
Private라도 연결 가능
동작의 주체가 되는 코드에서 AddListener 해준다면
Play 이전에서 연결해줘야한다 동적 바인딩 가능

 

#참조

https://blog.naver.com/pxkey/221365460579

 

유니티 「UnityEvent 객체」와 이벤트 핸들링

안녕하세요. 창작자 픽케입니다. 응용 프로그램의 「사용자 인터페이스(User Interface)」를 구성하는 다...

blog.naver.com

https://docs.unity3d.com/kr/530/Manual/UnityEvents.html

 

UnityEvent - Unity 매뉴얼

UnityEvent는 추가 프로그래밍 및 스크립트 설정 없이도 사용자 기반 콜백이 편집 시간부터 런타임까지 유지되도록 하는 방법입니다.

docs.unity3d.com

https://j2su0218.tistory.com/m/459

 

[유니티 Unity] 유니티 이벤트(Unity Event) 이해하기

이벤트(Event)란 무엇인가? Events는 이벤트를 '발생 시키는 쪽'과 이벤트에 대해 '반응하는 쪽'으로 되어 있다. 예를들어서 한개의 채널이 있을 경우 이 채널에 존재하는 구독자들이 있다고 생각했

j2su0218.tistory.com

https://felipuss.tistory.com/entry/%EB%8B%88%EC%95%99%ED%8C%BD%EC%9D%B4-%EC%9D%B4%EB%B2%A4%ED%8A%B8C-5-UnityEvent

 

| 니앙팽이 - 이벤트(C#) | 5 | UnityEvent

💡 5 UnityEvent유니티에서 이벤트를 사용해보자.다른 코드에 있는 함수를 가져오고 싶다.GameObject.Find(string ).Sendmessage(string ); 이거 대신 사용하고 싶다. 근데 문자열 하나 틀리면 디버깅해서 찾기

felipuss.tistory.com

someEvent.AddListener(_함수명_)

반응형

'Unity' 카테고리의 다른 글

Unity) Prefab  (3) 2023.10.24
Unity) Serializable, SerializeField  (2) 2023.10.23
Unity) Animator  (2) 2023.10.20
Unity) RayCast  (0) 2023.10.18
Unity) Draw gizmo selection  (4) 2023.10.17