
C#에서 델리게이트, 이벤트 / 유니티에서는 이벤트
Update()마다 값이 변화 되었는지 체크 하는 것은 비효율 적이다. 값이 변할 때만, 업데이트를 받는 콜백으로 구성하는 것을 옵저버 패턴이라고 한다. 기존의 델리게이트 제네릭, 이벤트, 그리고 유니티 이벤트로 구현되어 있고 사용해왔다
주시대상이 상태 변화가 있을 때 관찰자들을 호출하는 방식이 아닌, 관찰자들이 주시대상의 상태 변화에 반응하는 방법을 구현하는 방법 = 콜백옵저버 패턴은 구독자를 주체에 등록하는 방식. 추후 사용되지 않을 객체를 구독 해지한다. 그렇지 않을 경우, 불필요한 메모리 공간을 차지한다public event Action OnPaused;
public static void Pause()
{
Time.timeScale = 0f;
OnPaused?.Invoke();
}
Tank 스크립트
private void OnEnable()
// private void Start()
{
Manager.Game.OnPaused += 일시 정지 시 수행할 기능;
}
Tank 스크립트private void OnDisable()
//private void OnDestroy()
{
Manager.Game.OnPaused -= 일시 정지 시 수행할 기능;
}
몬스터가 800마리 정도가 있다 그러면 게임 매니저에서 삭제시키기에는 부담이 크다. 중계자를 만들어서 게임매니저 에서는 삭제 명령만 하달받고, 해당 수행은 중계자가 코루틴으로 구현한다. 그래서 업데이트마다 순회할 일이 없어서 가벼워진다참고
목록과 관찰자의 등록, 해제를 구현상태 변화를 확인하고 싶은 경우, 목록에 등록중재자 패턴을 사용한다객체 지향 시스템을 구축개방폐쇄원칙을 준수하게 됨이벤트 체인, 순환 구조 등의 문제public class Observer
{
public void Notify() { }
}
public class Subject
{
private List<Observer> observerList = new List<Observer>();
public void RegisterObserver(Observer observer)
{
observerList.Add(observer);
}
public void UnregisterObserver(Observer observer)
{
observerList.Remove(observer);
}
private void NotifyObserver()
{
foreach (Observer observer in observerList)
{
observer.Notify();
}
}
}