폴링 : 주기적으로 데이터 확인 해 주는것
어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지 받아 자동으로 갱신될 수 있게 만드는 패턴이다.
종속적 : A 라는 객체가 변화하면 B 나 C 도 같이 변화하는걸 의미
옵저버는 누군가를 구독할 수 있고 해제할 수 있다.
Subject는 자신의 변화를 옵저버에게 전달한다.
옵저버 패턴을 구현하는 방법은 다양하다. 제네릭을 이용할 수도 있고, 변화된 상태를 전달하는 것도 Subject가 같이 보내줄 수도 있고(Push Model), Observer가 알아서 꺼낼 수도 있다.(Pull Model). 핵심은 변화가 이뤄질 때, 나의 변화를 관찰할고 있는 대상들에게 통지를 해주면 된다. 요즘은 상속기반의 구현 뿐만 아니라 함수형을 이용하여 구현되기도 한다. C#의 이벤트가 그 예시이다.
using UnityEngine;
using UnityEngine.Events;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
UnityEvent m_MyEvent;
void Start()
{
if (m_MyEvent == null)
m_MyEvent = new UnityEvent();
m_MyEvent.AddListener(Ping);
}
void Update()
{
if (Input.anyKeyDown && m_MyEvent != null)
{
m_MyEvent.Invoke();
}
}
void Ping()
{
Debug.Log("Ping");
}
}
// C#의 이벤트 객체를 만들지 않아도 댐
public event UnityAction InGameEnd2;
public event UnityAction<int> OnScoreChanged2;
// 유니티 이벤트
public UnityEvent OnGameEnd = new UnityEvent();
public UnityEvent<int> OnScoreChanged = new UnityEvent<int>();
// Score에 대한 프로퍼티
public int CurrentScore
{
get
{
// 스코어 반환
return _currentScore;
}
set
{
// value : 프로퍼티를 구현할 때 사용가능
// Score 의 값이라고 보면 됨.
_currentScore = value;
OnScoreChanged.Invoke(_currentScore);
// C#의 이벤트는 널체크를 한다.
// 구독자가 있는지 확인(널체크)
OnScoreChanged2?.Invoke(_currentScore);
}
}
public void End()
{
_isEnd = true;
OnGameEnd.Invoke();
// C#에서의 이벤트는 널체크를 해야 함
OnGameEnd2?.Invoke();
}
void OnEnable()
{
// 혹시나 다른곳에서 AddLisrener()가 될 수 있으므로 구독해제를 해 준다.
GameManager.Instance.OnScoreChanged.RemoveListener(UpdateText);
// 이벤트 구독
GameManager.Instance.OnScoreChanged.AddListener(UpdateText);
// C# 에서의 이벤트 구독해제
GameManager.Instance.OnScoreChanged2 -= UpdateText;
// C# 에서의 이벤트 구독
GameManager.Instance.OnScoreChanged2 += UpdateText;
}
void OnDisable()
{
// 비 활성화 되면 이벤트 통지를 받을 필요가 없으므로 구독해제를 한것
GameManager.Instance.OnScoreChanged.RemoveListener(UpdateText);
// C#에서의 구독 해제
GameManager.Instance.OnScoreChanged2 -= UpdateText;
}
함수형 변수를 받아 사용하는것
AddListener() : 구독
구독은 +연산자로
구독해제는 -연산자로 한다.
유니런 코드 참조하기