이벤트: 이벤트가 발동 되면 그 사건에 등록해놓은 기능들이 자동으로 딸려들어가서 같이 발동이 됨
이벤트를 발동시키는 측, 그 이벤트에 기능을 등록해놨던 측 모두 서로에게 관심이 없음.
즉 이벤트에 기능을 등록해놓은 오브젝트들은 기능을 등록해놓고 그게 언제 발동될지 신경을 전혀 안씀.
또한 이벤트를 발동시키는 측도 자기 이벤트에 어떤 친구들이 등록이 됬는지 전혀 신경쓰지 않고 이벤트를 발동시켜버림.
장점: 서로에게 관심이 없기 때문에 코드가 꼬일 일이 없음.
상황 설정: 플레이어가 죽었을 때 여러가지 기능이 동작해야함
UI에 플레이어가 죽었다고 뜨고, 도전 과제가 해제되고, 게임을 재시작하는 기능 등을 발생시켜야함.
이 기능들을 플레이어의 죽음과 연계시킬 때 코드를 좀 더 깔끔하게 짜고 싶음
Player가 죽었을 때(PlayerHealth가 죽었다는 함수를 발동시킬 때)
자동으로 세가지 스크립트가 가지고 있던 기능들이 발동을 해야 함.
이 때 이벤트가 없으면 스파게티처럼 엮이게 됨.
<이벤트가 없을 때>
PlayerHealth.cs 에서 UIManager, AchivementSystem, GameManager을 일일이 다 가져와서 발동시켜야함.
단점: PlayerHealth가 player 죽음에 관여된 모든 것들을 전부 알고 있어야 함 -> 복잡!
또한 플레이어가 AchivementSystem, Score 등의 외부 시스템을 알고 있는 것도 논리적으로 말이 안됨!
원하는 것:
플레이어는 플레이어 죽음만 관심이 있어야 함!
단, 다른 친구들이 알아서 플레이어가 죽었을 때 발동이 되게 하고 싶다.
<이벤트 작동 원리>
이벤트는 이벤트가 발동이 될 때 명단에 등록된 기능들이 같이 발동이 되는데 이벤트는 그 명단에 누가 있는지 전혀 신경을 안씀.
이벤트에 자기 자신을 등록한 친구들도 그 명단을 들고 있는 이벤트를 발동시키는 측에 전혀 관심이 없음.
서로에게 관심이 없기 때문에 코드가 매우 깔끔해짐!!
<이벤트가 있을 때>
using UnityEngine.Events; 추가
PlayerHealth: 너희들이 내 죽음에 관심이 있으면 니들이 알아서 명단에 니들을 등록해놔. 근데 난 니들이 누군지 신경 안써.
public UnityEvent onPlayerDead: 기능들이 바깥에서 등록할 수 있는 명단, 바깥에서 들어와서 자기 자신을 등록만 해놓고 떠남
onPlayerDead.Invoke(): 플레이어가 죽었을 때 onPlayerDead라는 명단을 발동만 시키면 끝!
이제 플레이어 죽음에 관심 있는 친구들이 수천개가 늘어도 PlayerHealth 코드량이 전혀 늘어나지 않음!
이런식으로 이벤트리스트 추가하면 됨! public인 함수만 추가할 수 있음.
* Invoke 함수 : 어떤 함수를 명시해주고 지연시간을 명시해주면
지연시간만큼 시간이 흐른 후 함수를 발동시킴.
댓글