본문 바로가기
C#

유니티 이벤트

by imagineer_jinny 2021. 7. 20.

이벤트: 이벤트가 발동 되면 그 사건에 등록해놓은 기능들이 자동으로 딸려들어가서 같이 발동이 됨

 

이벤트를 발동시키는 측, 그 이벤트에 기능을 등록해놨던 측 모두 서로에게 관심이 없음.

즉 이벤트에 기능을 등록해놓은 오브젝트들은 기능을 등록해놓고 그게 언제 발동될지 신경을 전혀 안씀.

또한 이벤트를 발동시키는 측도 자기 이벤트에 어떤 친구들이 등록이 됬는지 전혀 신경쓰지 않고 이벤트를 발동시켜버림.

 

장점: 서로에게 관심이 없기 때문에 코드가 꼬일 일이 없음.

 

상황 설정: 플레이어가 죽었을 때 여러가지 기능이 동작해야함

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 함수 : 어떤 함수를 명시해주고 지연시간을 명시해주면 

지연시간만큼 시간이 흐른 후 함수를 발동시킴.

 

'C#' 카테고리의 다른 글

이벤트  (0) 2021.07.21
델리게이트  (0) 2021.07.20
프로퍼티  (0) 2021.07.19
추상 클래스  (0) 2021.07.19
인터페이스  (0) 2021.07.19

댓글