본문 바로가기

UNITY

UNITY_20230914[UNITY 팀 프로젝트 종료, 델리게이트]

과자 부수기 팀 프로젝트 일정이 종료됐다.
ReadMe, 발표 자료 작성으로 끝까지 프로젝트 제출의 발목을 잡았다.

좀 덜떨어진 발표 자료였는데, 팀장이 훌륭하게 발표를 진행했다.


특강 - 델리게이트의 활용 에 대해 필기한 내용을 이번 TIL의 주제로 삼는다.

 

아래는 필기한 내용이다.

델리게이트 사용 방법

델리게이트, 어떻게 사용해야 하는가? 델리게이트의 사용 타이밍, 방법, 사용 이유에 대해서 강의한다.

우선, 변수의 개념에 대해 짚고 넘어간다.
변수? 말 그대로 변하는 수, 할당되는 값에 따라 동작을 하는 데이터. int x = 3, 15, 252, 3452 .....
이 변수의 값에 따라 로직이 갖는 값은 달라지게 된다.

유니티의 로직을 상정해 본다.
SpawnPlayer() 메서드가 있다. 어떻게, 어디에, 언제, 몇개 생성해야 할까? 이는 개발자가 전부 계획해야 하는 일이다.
SpawnPlayer()는 다양한 상황에 적절한 로직으로 기능해야 할 것이다.
SpawnPlayer() => SpawnPlayerinBossRoom(), SpawnPlayerinCenter(), SpawnTwoPlayers() ....

같은 메서드가 서로 다른 상황에 따라 다른 값을 가진다? 이는 변수의 개념과 유사하다고 할 수 있다.
그냥 메서드를 쓴다면, 당연히 하나의 로직만 갖고 있다.

메서드에 여러 가지 데이터를 추가한다면? 이것이 델리게이트의 도입부다.
델리게이트의 기본 형태는 다음과 같다.

delegate void SpawnDelegateFunc();
델리게이트 선언/ 반환값/ 델리게이트이름(매개변수)

이것만으로는 아직 델리게이트가 생성된 것은 아니다. 선언만 한 상태다. string str; 이런 느낌이다.

아래는 델리게이트에 변수를 지정하는 코드다.
SpawnDelegateFunc spawnAction; 
SpawnDelegateFunc라는 델리게이트 형식에 spawnAction이라는 변수를 지정한 것이다.

다음은 spawnAction 변수가 사용할 함수(데이터)를 만든다. 아래는 그 예다.
void spawnPlayer_ARoom() {ARoom에 플레이어 생성}
void spawnPlayer_BossRoom() {BossRoom에 플레이어 생성}
당연히, 매개변수와 반환값은 적용할 델리게이트와 일치해야 한다.

이어서, 선언한 델리게이트 변수에 함수를 할당(저장)하는 과정이다. 아래는 그 코드다.
spawnAction = spawnPlayer_ARoom; <= 데이터를 할당하는 코드니까, 메서드의 실행 연산자()는 필요 없다.

이걸로 델리게이트를 사용할 준비는 끝났다. 그런데

이걸 대체 왜 쓰는가?
그냥 여러 변수를 조건문에 따라 실행되도록 작성하면 해결되는 일이다.

답은 확장성에 있다.

예측 가능한 상황(캐릭터가 생성될 고정된 위치)은 그 갯수가 유한하다.
하지만, 팝업UI를 만든다면? 개발 초기에는 물론, 마지막까지 가는 순간까지도 추가, 수정 등의 필요가 생긴다.
물론, 조건문이나 클래스로 조정할 수도 있다. 하지만 그만큼 동일한 작업을 반복할 것이다.

비슷한 로직을 계속 반복하면 그만큼 피곤하고 성능을 저하시키는 코드는 없다.

비슷한 상황에서 어떤 로직이 움직일지 지정할 코드, 필요할 데이터를 생성&저장하는 코드, 로직을 실행하는 코드 를 분리하여 관리함으로써 
반복 작업과 코드의 무게를 줄이고, 프로그램의 성능을 증대시킨다.

변수나 클래스 등 C#의 모든 요소는 그 '틀'을 갖고 있다.

메서드라고 예외는 없다. 메서드에 델리게이트라는 '틀(사실 발사대, 발판 같은 느낌이 좀 더 어울린다)'을 설치하고, 특정 조건이 맞으면 델리게이트를 통해 메서드를 작동시킨다.

적어도, 나는 이런 느낌을 받았다.

 

 

글만 잔뜩 써놓고, 이러면 사실 아무 의미 없다.

무조건 여러번 사용해 보면서 적절한 사용 타이밍, 사용 방법을 익히는 것이 가장 정확한 방법이다.