프로그래밍/유니티2016. 11. 11. 08:43


플레이어가 죽었을때, 몬스터들의 행동을 처리하는 두가지 방법이 나와서 소개해보고자 합니다.



첫번째 방법 입니다.

 

플레이어가 죽었다(체력이 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










'프로그래밍 > 유니티' 카테고리의 다른 글

유니티 비주얼스튜디오 ctrl + ' 단축키 설정법  (0) 2017.03.14
다이나믹 메시  (0) 2017.01.04
유니티 기본 이벤트 함수  (0) 2016.11.11
Physics.OverlapSphere,Quaternion.Lerp  (0) 2016.11.10
Coroutine  (0) 2016.11.09
Posted by JinFluenza