어제 하던 옵저버 패턴 실습 중에, 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