본문 바로가기

Game/Unity & C#

4장 이벤트 주도적 프로그래밍

4장 이벤트 주도적 프로그래밍

 

1. 이벤트

- 유니티에서 게임 월드는 완전히 결정론적인 시스템으로서 유한한 수의 게임오브젝트를 담는 씬이고, 데카르트 3D 좌표계와 시간을 가진다.

- 하나의 행동은 다른 행동을 수반하는 식으로 서로의 행동들은 중요환 관계를 맺고 있다. 이러한 연결이나 결합을 이벤트라고 부르는데, 각가의 개별적인 연결은 하나의 이벤트가 된다.

 

2. 이벤트 관리

- 이벤트 리스너(EventListener) : 자신이 발생시킨 이벤트를 포함한 어떤 이벤트가 발생하면 알기를 원하는 모든 오브젝트를 리스너(Listener:수신자)라고 부른다.

- 이벤트 포스터(EventPoster) : 리스너와 반대로 오브젝트가 이벤트 발생을 알아차린 경우, 이 오브젝트는 다른 모든 리스너가 알 수 있게 이벤트에 대해 알려야 한다. 진정한 포스터(Poster:발신자)가 되려면 오브젝트가 전역 레벨에서 이벤트를 발생시켜야 한다.

- 이벤트 매니저(EventManager) : 마지막으로, 여러 레벨에 걸쳐 계속 유지되며 전역적으로 접근이 가능한, 가장 중요한 싱글턴 EventManager 오브젝트가 있다. 이 오브젝트는 리스너를 포스터에게 실질적으로 연결하는 역할을 한다. 이벤트 매니저는 포스터가 보낸 알림을 받고 적합한 모든 리스너에게 이벤트 형식으로 즉시 알림을 발생시킨다.

 

3. 인터페이스를 통해 이벤트 관리

- 이벤트 처리 시스템의 첫째 구성 요소는 바로 특저 이벤트가 발생했을 때 알림을 받는 리스너다. 어떤 종류의 오브젝트나 클래스인지와 관계없이 특정 이벤트에 대한 알림만 받을 수 있다면 모두 리스너가 될 수 있다.

 

*이벤트 리스너 인터페이스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//--------------------------------------
// Game Event
public enum EVENT_TYPE
{
    GAME_INIT,
    GAME_END
};
 
//--------------------------------------
// Listern Interface
public interface IListener
{
    void OnEvent(EVENT_TYPE Event_Type, Component Sender, object Param = null);
}
 
 

*이벤트 리스너 상속

1
2
3
4
5
6
7
8
9
10
11
12
public class MyCustomListener : MonoBehaviour, IListener
{
    void Start() { }
    void Update() { }
 
    // OnEvent from IListener
    public void OnEvent(EVENT_TYPE Event_Type, Component Sender, Object Param = null)
    {
    
    }
}
 
 
 

4. 이벤트 매니저 만들기

- 서적 참고

 

5. 이벤트 매니저 활용

- 서적 참고

 

6. 델리게이트를 이용한 대안

- 서적 참고

 

7. 애플리케이션 포커스 상태에 따른 멈추기

- OnApplicationQuit : 게임이 종료되기 전, 씬과 씬의 내용물이 실질적으로 파괴되기 전 시점에 모든 오브젝트들에게 보내진다. 게임을 에디터에서 테스트하고 있었따면, 실행이 멈춰줬을 때 OnApplicationQuit가 호출된다. 하지만 중요한 내용으로, iOS 기기에서는 OnApplicationQuit가 호출되지 않는다는 점을 알아야 한다. iOS에서는 보통 애플리케이션을 종료하거나 끄는 대신에 사용자가 다른 일을 하는 동안 중단시켰다가 다시 돌아왔을 때 계속 실행하는 식으로 동작하기 때문이다. 실행이 중단되었을 때 OnApplicationQuit 이벤트를 받길 원한다면 Player Settings 창의 관련 옵션을 활성화시켜야 한다. 애플리케이션 메뉴의 Edit -> Project Settings -> Player를 선택하고, Other Settings -> Exit on Suspend 체크박스를 활성화 시킨다.

- OnApplicationFocus : 데스크톱 컴퓨터에서 멀티태스킹을 하던 중에 겡미 창이 비활성화되었을 때처럼, 게임이 포커스를 잃었을 때 씬의 모든 오브젝트에게 보내지는 이벤트다. 이 이벤트는 멀티플레이어 게임의 공유된 월드상에서 동작이나 이벤트가 계속 일어날 때, 플레이어가  적극적으로 참여하지 않는 상황이더라도 중요한 게임 내 이벤트로서 작용할 수 있다. 이런 경우, 특정 동작을 정지/재개하거나 게임 음악을 페이드 인/페이드 아웃해야 할 수 있다.


- OnApplicationPause는 유니티에서 중지의 개념을 명확히 정의하지 않는 관계로 모호한 이벤트다. 이는 둘로 나누어서 생각할 수 있다.
하나는 절대적 중지이다. 절대적 중지의 경우에는 겡미의 모든 활동과 이벤트가 완전히 중단되낟. 이때, 시간이 흐르지 않고 아무것도 진행되지 않는다. 다른 하나는 상대적 중지이다. 상대적 중지의 경우에는 게임이 스스로 중지 상태에 있다는 것을 알 수 있어서 게임 내 이벤트와 같은 이벤트는 멈추고 GUI 상호작용 및 유저 입력과 같은 이벤트는 멈추지 않을 수 있다.
OnApplicationPause이벤트는 전자의 개념이고 후자의 경우엔 해당되지 않는다. 이 이벤트는 몇 가지 조건이 충족될 때 호출되는데 이 조건들은 다음 절에서 살펴보자.

 

- 먼저, OnApplicationPause는 Player Settings 탭에서 Resoultion 그룹 밑의 Run In Background 옵션이 활성화되지 않았을 때 데스크톱에서만 호출된다. 이 옵션을 비활성화하면 창의 포커스를 잃었을 때 데스크톱 겡미이 자동으로 중지된다. OnApplicationPause는 OnApplicationFocus 이벤트에 따라온다는 의미다. iOS에서는 애플리케이션이 최소화되거나 백그라운드 밀려났을 때 OnApplicationPause가 호출된다