[Unity] 옵저버 패턴(Observer Pattern) -디자인 패턴

고현규·2023년 11월 24일

오늘 학습 내용

1. 옵저버 패턴 Observer Pattern
2. Action
3. InputManager


오늘 유니티 입문 주차에 들어가서 작성한 심플한 게임이다.
다른 학습 강의였다면 간단하게 이동만 했을 터인데

이번에 다른 점은 바로 옵저버 패턴으로 작성했다는 점이다.

1. 옵저버 패턴

옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다.

말 그대로 옵저버 패턴은 옵저버가 객체의 행동을 확인 하는 것이다.

이번 예제 프로젝트에서는 아래의 것들을 관리했다

  • 이동
  • 마우스 방향
  • 공격

내가 강의에서 직접 경험한 옵저버 패턴은 관찰 중인 행동이 들어왔을 때
델리게이트 - Action을 이용해서 행동에 해당하는 모든 메서드를 불러오는 것이다.

그래서 Action에 대한 개념을 다시 한번 읽고 이해했다.

2 Action

// event는 외부에서 호출할 수 없도록 만들어준다
public event Action<Vector2> OnMoveEvent;
public event Action<Vector2> OnLookEvent;

Action에 대해 쉽게 이해하기 위해 나는 이렇게 생각했다.

public OnMoveEvent<Vector2>()
{
	// Move가 일어날 때 실행할 메서드들
}

반환값이 없고 매개변수를 Vector2를 받는 매서드로 이해했고
아래와 같이 사용한다.

public void CallMoveEvent(Vector2 direction)
{
    OnMoveEvent?.Invoke(direction);
}

Invoke?.를 이용하기 위해 사용했고
쉽게 이야기해서 의미는 실행시킨다는 뜻으로 보았다.

즉, CallMoveEvent를 실행하면
OnMoveEvent에 +된 모든 메서드를 실행하는 것이다.
이것을 강의에서는 구독 한다고 표현했다.

private void Start()
{
    _controller.OnMoveEvent += Move;
}

private void Move(Vector2 direction)
{
    _movementDirection = direction;
}

OnMoveEventMove 함수를 + 해서 구독 하였다.


3. InputManager

요즘 유니티에서 입력을 받는 방법으로 InputManager를 유용하게 쓴다고 한다.
패키지 매니지에서 설치가 가능하다.

그럼 Project 탭에서 우클릭하여 Create > Input Action을 생성할 수 있다.

생성한 Input Action을 이렇게 만들 수 있고
설정한 입력을 편하게 작성할 수 있다.

만든 입력들의 이름 앞애 On을 붙이면 아래와 같이 사용할 수 있다.

public void OnMove(InputValue value)
{
    Vector2 moveInput = value.Get<Vector2>().normalized;
    CallMoveEvent(moveInput);
}

이렇게 입력을 받았을 때 위에서 설정한 CallEvent를 실행한다.
그렇게 CallMoveEvent안에 있는 Action 즉,
OnMoveEvent가 실행되고 여기에 구독시켜 두었던 함수들이 모조리 실행된다.

이렇게 옵저버 패턴이 만들어졌다.


후기

Action에 대한 개념이 아직 부족했었는데, 이번 기회에 한번 더 개념을 숙지하고
매커니즘을 이해할 수 있게 되었다.

새로운 기능 Input Manager를 보면서
OnMove 이게 어디서 온 메서드인가 했었다.
강의를 다시 돌려보고 알았다.

이전 팀에서 듣기만 했던 옵저버 패턴을 알게 되어 좋았다.

profile
게임 개발과 기획

0개의 댓글