· [중급자를 위한 유니티 스크립팅 튜토리얼] - Static
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 제네릭(Generic)
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 상속
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 다형성
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 인터페이스
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 확장 메서드
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 네임스페이스
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 리스트
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 딕셔너리
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 코루틴
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 쿼터니언
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 델리게이트
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 어트리뷰트
이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.
-----------------------------------------------------------------------------------
이벤트(Event)
이벤트는 특정 상황이 발생했음을 다른 클래스에 알리고 싶을 때 유용한 특수 델리게이트입니다.
실제로 이벤트는 퍼블릭 멀티캐스트 델리게이트와 매우 유사하게 작동합니다.
이벤트는 브로드캐스트 시스템으로 생각할 수 있습니다.
이벤트에 관심 있는 모든 클래스는 해당 이벤트에 메서드를 구독(subscribe)할 수 있습니다.
버튼 클릭, 또는 파워업과 같은 특정 상황이 발생하면 이벤트를 호출하여 구독된 클래스의 메서드를 호출합니다.
-----------------------------------------------------------------------------------
여기에 두 개의 circle이 있습니다.
한 circle에는 "Teleport Script"라는 스크립트가 있고, 다른 circle에는 "Turn Color Script"라는 스크립트가 있습니다.
메인 카메라에는 "Event Manager" 스크립트가 연결되어 있습니다.
화면에 생성한 버튼을 플레이어가 클릭할 때마다 이벤트를 호출하는 로직을 구현해보겠습니다.
-----------------------------------------------------------------------------------
Event Manager Script
EventManager에서 먼저 ClickAction()이라는 델리게이트를 생성합니다.
이벤트에 구독하려는 모든 메서드는 매개변수를 가지지 않고 반환형이 void여야 합니다.
다음으로, event 키워드를 사용하여 이벤트 변수를 생성합니다.
이 변수는 static이므로 객체를 인스턴스화하지 않고도 클래스 외부에서 사용할 수 있습니다.
OnClicked()라는 이벤트 변수는 위에서 생성한 델리게이트 유형입니다.
앞서 말했듯이 플레이어가 버튼을 클릭할 때마다 이 이벤트를 호출할 것입니다.
OnGUI() 메서드를 사용해 화면에 버튼을 만들었습니다.
플레이어가 버튼을 클릭하면 이벤트 변수를 함수처럼 사용하여 이벤트를 호출합니다.
델리게이트와 마찬가지로 구독자가 없는 이벤트를 호출하면 오류가 발생합니다.
따라서 이벤트를 호출하기 전에 항상 이벤트가 null이 아닌지 확인해야 합니다.
-----------------------------------------------------------------------------------
씬에 있는 두 개의 circle에는 두 가지 다른 스크립트가 장착되어 있습니다.
이 두 스크립트가 이벤트의 구독자 역할을 할 것입니다.
-----------------------------------------------------------------------------------
Teleport Script
TeleportScript에는 Teleport()라는 메서드가 있습니다. 이 메서드는 EventManager에서 생성한 이벤트에 구독할 메서드입니다.
Teleport() 메서드는 델리게이트와 마찬가지로 매개변수를 가지지 않고 반환 유형이 void입니다.
Teleport() 메서드는 오브젝트를 랜덤한 Y값으로 위치를 옮깁니다.
스크립트 상단에는 OnEnable()이라는 메서드가 있습니다.
이것은 스크립트가 연결된 오브젝트가 씬에서 생성되거나 활성화될 때마다 호출되는 내장 메서드입니다.
이 메서드를 사용하여 Teleport() 메서드를 EventScript의 OnClicked 이벤트에 구독할 것입니다.
+= 연산자를 사용하여 메서드를 이벤트에 구독합니다.
메서드를 이벤트에 구독함으로써 이벤트가 발생할 때마다 메서드가 호출되도록 합니다.
다음으로, OnDisable() 메서드가 있습니다.
OnEnable() 메서드와 반대로 OnDisable() 메서드는 오브젝트가 씬에서 비활성화되거나 파괴될 때 호출됩니다.
OnDisable() 메서드 내부에서는 이벤트에서 메서드를 구독 해제하고 있습니다.
-= 연산자를 사용하여 이벤트에서 메서드를 구독 해제합니다.
이렇게 하면 이벤트가 발생할 때 메서드가 더 이상 호출되지 않습니다.
이 단계는 매우 중요합니다.
이를 소홀히 하면 메모리 누수 및 게임 오류가 발생할 수 있습니다.
좋은 규칙은 메서드를 이벤트에 구독할 때마다 구독을 해제하는 기능도 같이 만들어야 한다는 것입니다.
-----------------------------------------------------------------------------------
Turn Color Script
TurnColorScript는 TeleportScript와 매우 유사하게 구성되어 있습니다.
TurnColor() 메서드는 오브젝트의 재질을 무작위 색상으로 변경합니다.
다시 한 번, OnEnable() 및 OnDisable() 메서드가 있습니다.
이번에는 TurnColor() 메서드를 이벤트에 구독하고 구독 해제합니다.
코딩 오류를 방지하고 이벤트를 올바르게 사용하기 위해서는 이벤트에서 메서드를 구독 해제하는 것이 매우 중요합니다.
-----------------------------------------------------------------------------------
Unity로 돌아가 씬을 실행할 수 있습니다.
가장 먼저 눈에 띄는 것은 상단에 나타나는 Click버튼입니다.
이 버튼을 클릭하면 이벤트가 호출되어 Teleport() 및 TurnColor() 메서드가 호출됩니다.
버튼을 여러 번 클릭할 수 있으며, 클릭할 때마다 구독된 메서드가 호출됩니다.
-----------------------------------------------------------------------------------
이벤트 사용의 장점
보시다시피, EventManager는 이벤트 자체와 이벤트 트리거에 대해서만 신경 쓰면 됩니다.
TeleportScript나 TurnColorScript에 대해 알 필요가 없었습니다.
마찬가지로, TeleportScript와 TurnColorScript는 서로에 대해 알 필요가 없었습니다.
이런 방식으로 우리는 매우 견고하고 유연한 브로드캐스트 시스템을 만들 수 있습니다.
-----------------------------------------------------------------------------------
EventManager에서 public 델리게이트 변수 대신 static 이벤트 변수를 사용한 이유가 궁금할 수 있습니다.
사실, public 델리게이트 변수로도 이벤트와 정확히 동일한 기능을 할 수 있습니다.
시작부분에서 언급했듯이 이벤트는 특수한 델리게이트입니다.
이러한 상황에서 public 델리게이트 변수대신 이벤트를 사용하는 이유는 이벤트에는 델리게이트 변수에는 없는 고유한 보안 기능이 있기 때문입니다.
이벤트의 경우 다른 클래스는 구독 및 구독 해제만 할 수 있습니다.
public 델리게이트 변수를 대신 사용했다면 다른 클래스가 델리게이트 변수를 호출하거나 재정의하는 온갖 나쁜 짓을 할 수 있었을 것입니다.
일반적으로 둘 이상의 클래스가 관련된 동적 메서드 시스템을 만들려면 델리게이트 변수 대신 이벤트 변수를 사용하는 것이 좋습니다.
댓글 0