어제 하던 옵저버 패턴 실습 중에, System.Action 말고도 Unity에서 지원해주는 UnityEngine.Events.UnityAction도 있다는 걸 알았다.
실습 진행상황과 함께 저 둘의 차이점도 한 번 정리해보려 한다.
public event Action<int, int> OnLevelChanged;
public event Action<int> OnKill;
public event Action OnDead;
public event Action<float, float> OnHPChanged;
public event Action<float, float> OnMpChanged;
public event Action<float, float> OnExpChanged;
void Start()
{
OnHPChanged += IsDead;
OnHPChanged += GameObject.Find("Player Info UI").transform.GetChild(0).GetComponent<InfoUI>().SetUIBar;
OnMpChanged += GameObject.Find("Player Info UI").transform.GetChild(1).GetComponent<InfoUI>().SetUIBar;
OnExpChanged += GameObject.Find("Player Info UI").transform.GetChild(2).GetComponent<InfoUI>().SetUIBar;
OnExpChanged += LevelUp;
OnLevelChanged += GameObject.Find("Player Info UI").transform.GetChild(3).GetChild(1).GetComponent<InfoUI>().SetUILvText;
OnLevelChanged += LevelUpVFX;
OnDead += achievement.AchieveFirstDeath;
OnLevelChanged += achievement.AchieveMaxLv;
OnKill += achievement.AchieveKills;
HP = MaxHP;
MP = MaxMP;
EXP = 0;
LV = 1;
}
OnLevelChanged, OnDead, OnKill 등을 추가로 작성해서 업적과 관련된 메서드들을 등록시켜줬다.
또, 기존에 void delegate StatusChangeHandler(float, float)로 작성했었던 delegate를 System.Action으로 바꾸고 통일해줬다.
이 과정에서 delegate를 inspector 창에 노출시킬 순 없을까? 하고 찾아봤는데, 그러기 위해선 UnityEngine.Events.UnityEvent를 사용해야한다고 한다.
업적은 Player의 여러가지 상태를 구독하고 있어야 한다. 그런데 interface를 이용한 옵저버 패턴 구현은 Player 클래스 자체를 구독하고 Player 클래스는 자신의 상태가 바뀌면 어떤 것이 바뀌었든간에 업적관리 클래스에게 Notify()로 공지한다. 이러면 업적관리 클래스는 Player의 어떤 것이 바뀌었는지 모르기 때문에 하나하나 검사를 해봐야한다. 예를 들면,
따라서, delegate를 이용하면, 업적관리 클래스는 Player의 변수 하나하나를 구독할 수 있게 되고 이렇게 구현하는 게 interface를 사용하는 것보다 더 의존성도 적고 구현하기도 쉬울 것 같았다.

(interface로 구현 시, 클래스 단위의 구독)

(delegate로 구현 시, property/method 단위의 구독)

달성되지 않은 업적은 회색 글씨로 보여주고, 달성한 업적은 검은색 글씨로 보여준다.
OnClick()이나 OnValueChanged()와 같은 Event가 이 녀석으로 구현됨.MonoBehaviour를 상속받는 클래스에 사용 가능AddListener()를 이용해 대리자를 연결함.둘의 장단점이 명확하다. 빠른 속도와 간결한 코드가 필요하다면 C# Event를 사용하면 되고, Inspector창과의 호환으로 Unity Editor에서 추가 작업을 필요로하면 UnityEvent를 사용하면 되겠다.
https://highfence.tistory.com/19
https://www.jacksondunstan.com/articles/3335
https://coding-shop.tistory.com/91?category=1165832