티스토리 뷰

오늘 한 일 (회고)

오전

  • 토끼 움직임 어색한 부분 수정하기
  • 수준별 꾸준실습

오후

  • 좀비 죽었는데도 연타 시 움직이는 오류 고치기
  • 좀비와 토끼가 나오는 스폰존 만들기

공부한 것

Coroutine

 

spawnZone을 만들어서 그 영역안에 플레이어가 에 들어가면 rabit이나 좀비가 생성되는 로직을 짯으나

그 영역을 벗어나자마자 사라지는 게임에서 어색한 부분이 생겼습니다.

그래서 어느정도 플레이어와 거리를 두면 사라지게 하는게 좋겠다 생각했으나

update를 통해 하기엔 너무 자원낭비인 것 같아 찾아본 방법이 coroutine이었습니다.

 

아래는 활용법입니다.

 

 

 

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        for (int i = 0; i < spawnCount; i++)
        {
            GameObject rabbit = spawnManager.SpawnEnemies(transform.position, PoolObject.rabit);//이 위치에서 스폰
            SpawnRabbits.Add(rabbit);
        }
    }
}

 

 

 

콜라이더 안에 플레이어가 들어오면

SpawnManager에 있는 SpawnEnemines함수를 이용해 spawCount 만큼 토끼를 생성합니다.

그리고 생성한 토끼는  spawndRabbits에 모아줍니다.

 

 

 private void OnTriggerExit(Collider other)
 {
     if (other.CompareTag("Player"))
     {
         if (deactivateRabbitsCoroutine != null)
         {
             StopCoroutine(deactivateRabbitsCoroutine);
         }
         deactivateRabbitsCoroutine = StartCoroutine(DeactivateRabbitsCoroutine());
     }
 }

 

여기서부터 코루틴을 사용합니다

플레이어가 영역밖으로 나가고 deactivateRabbitsCoroutine(코루틴)이  null이 아니라면 코루틴 실행을 중단해줍니다

 

여기서 중단하는 이유는 이미 실행되고 있는 코루틴이 있다면

두개의 코루틴이 같이 동작할 수 있기때문에

시작하기전에 중단해주는 방어코드입니다.

 

그리고 코루틴을 다시 시작해주면서 deactivateRabbitsCoroutine을 다시 정의해줍니다.

 

private IEnumerator DeactivateRabbitsCoroutine()
{
    foreach (GameObject rabbit in SpawnRabbits)
    {
        if (rabbit != null)
        {
            float distance = Vector3.Distance(playerTransform.position, rabbit.transform.position);
            if (distance > despawnDistance)
            {
                rabbit.SetActive(false); // 거리가 멀어지면 비활성화
            }
        }
        yield return new WaitForSeconds(1f);
    }
    deactivateRabbitsCoroutine = null;

 

 

 

IEnumerator는 C#에서 반복기(iterator)를 나타내는 인터페이스로, 주로 코루틴에서 사용됩니다.

 

SpawnRabbits 리스트에서 rabbit오브젝트를 꺼내와줍니다

rabbit이 null이 아니라면 플레이어와 rabbit의 거리값을 가져오고

만약 그 거리가 일정거리보다 멀다면 rabbit을 비활성화합니다

그리고 1초 기다린 후 이와같은 작업을 반복합니다

5초후면 모든 토끼가 사라지고 코루틴이 종료됩니다.

 

deactivateRabbitsCoroutine 을 null로 지정해 참조하고있던 코루틴을 제거해줍니다.

코루틴은 아래와같은 상황에 종료가 됩니다.

코루틴이 종료되는 경우

  • 코루틴의 실행이 끝났을 때
  • stopCoroutine을 호출 했을 때
  • 오브젝트가 비활성화 되거나 파괴할때
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함