[UNITY]유니티 TIPS::대상의 액션에 반응하는 로직을 만드는 Observer 패턴 | 프로그래밍 디자인패턴, 요약정리

https://www.youtube.com/watch?v=Sq6LAJ9tqBY&list=PL412Ym60h6uufFJlxsKcYkOtRu-PIsLuA&index=3

 

옵저버 패턴은 주체와 관찰자 간의 효율적인 관계를 통해 다양한 이벤트를 처리하는 구조입니다. 이 패턴을 통해 유니티 환경에서 버튼 클릭 같은 이벤트 발생 시 여러 작업을 동시에 수행할 수 있습니다. 옵저버와 서브젝트가 서로 독립적이면서도 유기적으로 연결되어 있어 확장성과 재사용성을 높여줍니다. 이벤트와 델리게이트를 활용하여 다양한 상황에 맞춘 유연한 시스템 설계가 가능합니다. 그러나 이 패턴이 여러 객체와 함께 사용될 경우 발생할 수 있는 복잡성과 메모리 누수 문제는 주의가 필요합니다.

 

🤖 옵저버 패턴 개요

  • 옵저버 패턴은 특정 대상(서브젝트)을 주시하고, 그 대상에서 이벤트가 발생하면 여러 옵저버가 반응하는 구조이다.

  • 버튼을 서브젝트로 하고, 파티클, 오디오 등 다양한 옵저버들이 존재하여 서로에게 신호를 전달하고 반응하게 된다.

  • 옵저버들은 서브젝트에 등록하여 자신의 역할을 수행하며, 이러한 구조는 확장성과 유지보수에 용이하다.

 

 🎮 옵저버 패턴과 델리게이트의 연관성

 
  • 옵저버 패턴은 간단한 언어로 쉽게 구현할 수 있으며, 시합과 같은 시스템에서 자연스럽게 사용된다.

  • 델리게이트는 대리자로서 함수를 대신해주는 개념으로, 함수 포인터를 사용하는 것과 유사하다.

  • 델리게이트를 사용하면 여러 함수를 담는 변수처럼 활용할 수 있으며, 이를 통해 함수 호출 및 추가적인 연산이 가능하다.

  • 멀티캐스트 델리게이트는 여러 개의 함수를 담아 동시 호출할 수 있는 방식으로, 편리한 사용법과 효율성을 제공한다.

  • 델리게이트는 서로 다른 클래스 간의 콜백 등록에 유용하며, 특히 유니티 게임 개발에서 많이 사용된다.

 

🎮 옵저버 패턴과 이벤트 시스템

  • 델리게이트는 이벤트를 정의할 때 사용되며, 클래스 외부에서 접근하지 못하도록 캡슐화하는 역할을 한다.

  • 이벤트는 델리게이트를 기반으로 하며, 호출 과정에서 직접 호출이 불가능한 방식으로 구현된다.

  • C#의 이벤트 액션 기능은 사용하기 간편하며, 다양한 상황에서 활용될 수 있다.

  • 옵저버 패턴을 활용하면, 버튼 클릭과 같은 이벤트를 텔레포트 스크립트와 결합하여 결합성을 낮추고 유지보수를 쉽게 한다.

  • 이벤트 매니저와 연결된 옵저버는 상황이 발생할 때만 실행되며, 이는 훨씬 효율적이고 간단한 구조를 만들어준다.

 

 🔍 옵저버 패턴의 이해와 활용

 
  • 옵저버 패턴은 서브젝트가 해준 클릭 이벤트를 기반으로 다른 객체들이 반응할 수 있게 해준다. 클릭 시 마우스 위치를 체크하여 버튼 클릭 여부를 판단한다.

  • 오디오 옵저버는 서브젝트가 자신의 함수를 등록하여, 클릭 이벤트 발생 시 사운드를 출력하는 등의 기능을 수행한다.

  • 옵저버 패턴은 느슨한 결합과 재사용성, 확장성을 제공하므로 UI 기반 이벤트 시스템에서 주로 사용된다.

  • 네트워크 연결 상태 변화 시에도 옵저버 패턴이 유용하게 활용되며, 데이터 변경 사항을 실시간으로 관리할 수 있다.

  • 유니티에서는 유니티 액션유니티 이벤트를 사용하여 옵저버 패턴을 쉽게 구현할 수 있으며, 프로그래머가 아닌 사용자도 손쉽게 사용할 수 있도록 설계되어 있다.

 

 ⚠️ 옵저버 패턴의 복잡성과 위험성

 
  • 옵저버 패턴은 여러 개의 객체가 상호작용하는 구조를 가지며, 이로 인해 시스템의 복잡성이 증가한다.

  • 등록된 옵저버들이 호출 순서와 관계없이 동작하기 때문에, 예측 불가능한 행동이 발생할 수 있다.

  • 옵저버의 등록 해제를 실수로 잊으면 메모리 누수가 발생할 위험이 있다.

  • 많은 옵저버가 등록된 경우, 그 수에 따라 성능 저하디버깅의 어려움이 생길 수 있다.

  • 순환 참조가 발생할 경우 무한 루프에 빠질 수 있으며, 이는 설계 시 주의가 필요하다는 점에서 큰 단점으로 작용한다.