'프로그래밍/유니티'에 해당되는 글 54건

  1. 2016.11.11 이벤트 활용
  2. 2016.11.11 유니티 기본 이벤트 함수
  3. 2016.11.10 Physics.OverlapSphere,Quaternion.Lerp
  4. 2016.11.09 Coroutine
프로그래밍/유니티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
프로그래밍/유니티2016. 11. 11. 05:43

출처 : 유니티 메뉴얼 :  https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html

다음 그림은 스크립트의 유효기간 동안 이벤트 함수의 순서와 반복 처리를 정리 한 것입니다.

자주 사용되는 함수 정리


Awake() : 스크립트가 실행될 때 딱 한번만 호출됨. Start함수가 호출되기 전에 먼저 실행되고.

스크립트가 비활성화돼 있어도 실행된다고 함. 코루틴으로는 실행 불가능.


Start()  : Update() 함수 호출전에 딱 한번만 호출된다. Awake()와 다른점은 스크립트가 활성화 되어있어야 호출된다는 점.

다른스크립트의 Awake()가 모두 호출된 후에 실행된다. 코루틴으로 실행 가능하다.


Update() : 매 프레임 마다 호출되는 함수로 주로 게임의 핵심 로직을 여기에 작성한다. 스크립트가 활성화 되어 있어야 실행된다.


LateUpdate() : 모든 Update()함수가 호출되고 나서 한 번씩 호출된다. 순차적으로 실행하는 로직에 사용하면 좋고, 카메라 이동 로직에 주로 사용된다고

한다.  마찬가지로 스크립트가 활성화돼 있어야 실행이 된다.


FixedUpdate(): 이 함수는 Update()보다 자주 호출되는 경우가 많다. 프레임 속도가 낮은 경우에는 프레임마다 여러번 호출 될 수도 있다.

그러나 프레임 속도가 높은 경우에는 프레임간에 호출 될 수는 없다. 모든 물리적 특성 계산 및 업데이트는 FixedUpdate() 이후에 발생한다.

그리고 이 함수 내에서는 Time.deltaTime 값을 곱할 필요가 없는데 왜냐하면 프레임 속도와 독립적으로 FixedUpdate()만의 신뢰 할 수 있는 타이머에서 호출되기 때문이라고 한다. 타이머에 따라서 발생하는 주기가 일정하다.

(Edit -> Project setting -> Time 메뉴에 들어가면 발생 주기를 직접 입력 할 수 있다.)


OnEnable() : 게임 오브젝트 또는 스크립트가 활성화됐을 때 호출된다. 코루틴으로는 실행이 불가능.


OnDisable() : 게임 오브젝트 또는 스크립트가 비활성화됐을 때 호출된다. 코루틴으로는 실행이 불가능.



*주의 :  오타를 잡아주지 못하기 때문에 스펠링을 정확하게 써야 원하는 방향으로 작동한다.




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

유니티 비주얼스튜디오 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
프로그래밍/유니티2016. 11. 10. 02:32

간단한 소스코드

실행영상입니다.

Collider[] collisions = Physics.OverlapSphere(me.position, 20.0f); 요구문을 통해 collisions에 현재 위치에서

반경 20거리의 있는 모든 Collider 컴포넌트 정보를 받아옵니다.

그중에서 태그가 ENEMY(빨간색 큐브) 인것을 찾으면 타겟으로 설정하고 이것을 이용해 회전각을 구해서 회전합니다.


코드상 문제가 있는것은 댓글로 알려주시면 정말 감사하겠습니다..  많은 도움이 됩니다.



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

유니티 비주얼스튜디오 ctrl + ' 단축키 설정법  (0) 2017.03.14
다이나믹 메시  (0) 2017.01.04
이벤트 활용  (0) 2016.11.11
유니티 기본 이벤트 함수  (0) 2016.11.11
Coroutine  (0) 2016.11.09
Posted by JinFluenza
프로그래밍/유니티2016. 11. 9. 02:28
유니티 메뉴얼에서 본 정보인데 까먹기전에 여기에 복사해논다.

코루틴은 실행을 중지하여 Unity에 제어권을 돌려주고, 그러나 계속할 때는 다음 프레임에서 중지한 곳부터 실행을 계속할 수 있는 기능입니다. C#에서 코루틴은 다음과 같이 선언합니다:

IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;
    }
}

즉, 이것은 IEnumerator 형식을 반환값으로 가지며 yield return 구문을 어디엔가 포함하고 있는 함수입니다. yield return 행은 실행을 중지하고 다음 프레임에서 실행을 재개할 수 있는 지점입니다. 코루틴을 실행하려면 StartCoroutine 함수를 사용합니다. \n

void Update() {
    if (Input.GetKeyDown("f")) {
        StartCoroutine("Fade");
    }
}



적이 많은 경우에 이 함수를 매 프레임 호출 하여 현저한 오버 헤드를 초래할 지도 모릅니다. 그러나 코루틴을 사용하여 1/10 초 간격으로 호출할 수 있습니다:

IEnumerator DoCheck() {
    for(;;) {
        ProximityCheck;
        yield return new WaitForSeconds(.1f);
    }
}

따라서 게임에 악영향을 주지 않고 체크 횟수를 비약적으로 감소시킬 수 있습니다.



StopAllCoroutines() 이라는 함수가 있는데

해당 클래스 내에서 진행되고 있는 코루틴 함수들을 전부 중지시킵니다.



보다 자세한 설명

http://unityindepth.tistory.com/21 여기에 잘 나와있습니다



그리고.. StartCoruotine(함수명()) 으로 실행한 코루틴은 StopCoroutine으로 멈출수 없다고 합니다.

함수명() 대신에 "함수명" 으로 실행해야 StopCoroutine("함수명") 으로 멈출수 있다고 하는데; 버그인지 뭔지는 알아봐야 할 것 같네요


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

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