플레이어가 죽었을때, 몬스터들의 행동을 처리하는 두가지 방법이 나와서 소개해보고자 합니다.
첫번째 방법 입니다.
플레이어가 죽었다(체력이 0이하가 됬을때) ->PlayerDie 함수를 호출한다.
PlayerDie 함수 에서는 모든 몬스터의 게임 오브젝트를 찾아서 하나하나 플레이어의 죽음을 처리한다.(플레이어가 죽었으니 애니메이션을 종료하라던지의)
void PlayerDie()
{
//FindGameObjectsWithTag()함수는 인자로 넘겨준 태그를 갖고있는 모든 게임오브젝트를 찾아서 배열로 반환.
GameObject[] monsters = GameObject.FindGameObjectsWithTag("MONSTER");
foreach(GameObject monster in monsters)
{
//SendMessage함수는 특정 게임오브젝트의 함수를 호출하는 명령입니다.
//첫번째 인자는 해당 게임오브젝트의 함수명,두번째는 옵션입니다.
monster.SendMessage("OnPlayerDie",SendMessageOptions.DontRequireReceiver);
}
}
이런식으로 플레이어가 죽었을때 모든 몬스터들의 게임오브젝트를 받아와서 직접 처리하는 방법이 있습니다.
하지만 이 방법은 성능에 문제가 많습니다.
두번째 방법.
원리는 간단합니다. 플레이어가 죽었을때, 유니티 엔진에 플레이어가 죽었다고 알려줘서 시스템에서 이벤트를
발생시킵니다. 이때 이 이벤트에 연결된 모든 몬스터에서 해당 동작을 수행하게 하는 방법입니다.
이를 위해서 Delegate,Event를 사용합니다. (Delegate,Event 에대한 설명은 http://blog.eairship.kr/151 참조..)
플레이어 스크립트에 다음과 같이 딜리게이트 , 이벤트를 선언합니다.
public delegate void PlayerDieHandler();
public static event PlayerDieHandler OnPlayerDie;
그리고 플레이어가 죽었을때 이벤트를 발생시킵니다.
if(this.hp<=0)
{
OnPlayerDie();
}
이벤트를 선언하고 발생시킬 준비를 마쳤습니다. 이제 몬스터에서 OnPlayerDie 이벤트에 반응할 특정 함수를 연결시키기만 하면 됩니다.
몬스터 스크립트에 다음과 같은 형식으로 만듭니다.
void OnEnable()
{
PlayerScript.OnPlayerDie += this.OnPlayerDie;
}
void OnDisable()
{
PlayerScript.OnPlayerDie -= this.OnPlayerDie;
}
void OnPlayerDie()
{
//플레이어가 죽었으니 길찾기를 중지해라.
//플레이어가 죽었으니 춤추는 애니메이션을 실행해라
//던지의..
}
이제 플레이어에서 OnPlayerDie() 이벤트를 발생시키면 몬스터의 OnPlayerDie() 함수들을 호출하게 됩니다.
OnEnable()과 OnDisable() 은 스크립트가 활성화,비활성화 될 때 수행되는 함수이며.
이벤트의 연결 및 해지는 반드시 이 함수 안에서 다음과 같은 문법으로 처리해야 한다고 합니다.
이벤트 연결 : (이벤트가 선언된 클래스명).(이벤트명) +=(이벤트 발생 시 호출될 함수)
이벤트 해지 : (이벤트가 선언된 클래스명).(이벤트명) -=(이벤트 발생 시 호출될 함수)
-참고서적 절대강좌 유니티5