옵저버 패턴이란 객체의 상태 변화를 관찰자(옵저버) 목록을 특정 객체(Subject)에 등록하여 옵저버의 상태변화가 있을때 마다 Subject에서 목록의 옵저버에게 통지하도록 하는 1:N 구조의 디자인패턴이다.
주로 이벤트 핸들링 시스템을 구현하는데 사용된다 하며 많이쓰는 패턴인거같아 간단하게 구현해보았다.
리스트를 사용하는방법과 델리게이트를 사용하여 구현하는방법이있으며 나는 후자의 방법으로 구현하였다.
public abstract class Observer : MonoBehaviour
{
public abstract void Notify();
}
옵저버 베이스 코드, 상속과 재정의를 위해 추상클래스로 구성했으며 인터페이스로 구성해도 상관없다.
public class KeySubject : MonoBehaviour
{
public delegate void KeyNotification();
event KeyNotification keyNotification;
public int NextKey;
static KeySubject _instance;
public static KeySubject Instance
{
get => _instance;
}
private void Awake()
{
if (_instance == null)
{
_instance = this;
}
else if (_instance != null)
{
Destroy(this.gameObject);
}
}
public void Add(KeyNotification noti)
{
keyNotification += noti;
}
public void Remove(KeyNotification noti)
{
keyNotification -= noti;
}
public void ObserverUpdate()
{
keyNotification();
NextKey++;
}
}
테스트용 Subject 코드 옵저버쪽 Start에서 이벤트 등록을 위해 싱글톤으로 구성함.
public class KeyObserver : Observer
{
public int num;
private void Start()
{
KeySubject.Instance.Add(Notify);
gameObject.SetActive(false);
}
//해당옵저버에서 동작할 함수
public override void Notify()
{
if (num.Equals(KeySubject.Instance.NextKey))
{
gameObject.SetActive(true);
}
else
gameObject.SetActive(false);
}
}
테스트용 옵저버 코드 Subject에서 숫자를받아 해당하는 오브젝트만 활성화하도록 구현
결과 Subject에서 NextKey를 받아 옵저버를 업데이트 시킬때마다 노출되는 오브젝트가 달라진다.
'Unity > Engine' 카테고리의 다른 글
[Unity]Action vs UnityAction (0) | 2023.08.15 |
---|---|
디바이스별 그래픽 API (0) | 2022.04.10 |
Vector3 Roatation(벡터 회전) (0) | 2022.02.16 |
유니티 특정 디렉토리 파일 불러오기 (0) | 2022.02.14 |
코루틴 매니저 (0) | 2022.02.09 |