📒 갈무리 - Unity Event
📌 Unity Event란?
- C#의 이벤트와 델리게이트 기능을 사용하기 편하도록 랩핑 해놓은 것
- 어떤 이벤트가 발생하면 그 이벤트에 등록해 둔 모든 함수가 자동으로 호출된다.
- 등록된 함수들은 언제 발동될지, 어떻게 발동될지 관심이 없다.
- 이벤트를 발생시키는 측도, 이벤트에 등록된 함수들도 서로에게 관심이 없다.
- 코드들이 스파게티처럼 엮이지 않아 코드가 간결해진다.
📌 이벤트를 사용하지 않았을 때의 예를 들어보자...
PlayerHealth에서 플레이어가 죽었음을 감지했을 때 일어나는 상황을 가정
UIManager
- 도전 과제가 해제되었다는 메세지를 화면에 출력
AchivementSystem
- 플레이어가 죽으면 5초 뒤에 게임을 재시작시킨다.
GameManager
- "You Die!" 텍스트를 화면에 출력
public class PointManager : MonoBehavior
{
public UIManagger uiManager;
public AchivementSystem achivementSystem
public GameManager gameManager;
private void Dead()
{
uiManager.OnPlayerDead();
achivementSystem.UnLockAchivement();
gameManager.OnPlayerDead();
Debug.Log("Dead");
Destroy(gameObject);
}
}
위처럼 이벤트를 사용하지 않고 구현하였을 때의 문제점
- 실행시키는 측, 실행되는 측 둘 다 서로를 알고 있고 연결되어 있어야 한다.
- PlayerHealth.cs는 UIManager, AchivementSystem, CameNanger 이 3개를 다 알고 있어야 한다. (무언가 추가되면 그것 또한 알아야 할 것이다.)
- 각 3개 스크립트를 참조할 수 있는 변수를 선언하고(uiManager, achivementSystem, sameManager) 유니티 슬롯에 각 3개의 스크립트가 붙어있는 오브젝트들을 죄다 드래그 앤 드롭 해주어야 한다.
- 그러나 AchivementSystem은 보통 게임 제작이 완료된 후에 만들기 때문에 PlayerHealth.cs를 쓸 때는 AchivementSystem 에 대한 정보를 모를 수 있다.
- PlayerHealth.es 은 딱 플레이어의 체력에 관한 내용만 들어가는 것이 좋은데 UManager, Achivementsystem, CameNanger 등 다른 오브젝트들까지 다 알고 있어야 한다.
- 플레이어와 관련된 기능이 추가될 때마다 PlayerHealth.cs에 또 참조할 수 있는 변수를 추가해야 한다.
- 스파게티 코드가 될 확률이 높다.
- 코드가 점점 복잡해지고 서로의 코드에 영향을 많이 받게 된다.
- 이벤트가 발생할 시 실행되야 할 함수가 많다면 일일이 유니티 슬롯에서 다 드래그 앤 드롭 해주어야 하는 불편이 따른다.
📌 이벤트를 사용한다면...
public class PlayerHealth : MonoBehavior
{
public UnityEvent onPlayerDead;
private void Dead()
{
onPlayerDead.Invoke();
Debug.Log("Dead!");
Destroy(gameObject);
}
}
- 결합성이 낮아진다.
- 코드 관리가 아주 수월해진다.