[Unity] 코루틴 일시정지시에 시점 복구하기

2022. 2. 24. 13:12·etc/Unity

엄청 오랜만에 포스팅

 

몬스터를 Spawn하는 코루틴을 이용하다가

Time.timeScale을 건드리지 않고 Spawn을 멈춰야 될 상황이 생겼다.

 

IEnumerator SpawnEnemy()
{
    while(enemyCount < 10)
    {
    	Instantiate(~);
        
        enemyCount++;
    	yield return new WaitForSeconds(2f);
    }
}

코루틴은 이렇게 생겼었다

 

바로 드는 생각은

StopCoroutine("EnemySpawn");

요거여서 그대로 했는데 Spawn이 잘 멈췄다.

그러고 다시 

StartCoroutine("SpawnEnemy");

실행!

 

하지만 문제가 하나 생겼는데 

2초마다 일정 간격으로 줄지어서 이쁘게 나오던 몬스터들이 Spawn이 정지됐다가 재개되는 그 사이에 간격이 흐트러지는 것이다.

 

StopCoroutine다음 StartCoroutine을 할 때 엔진딴에서 interrupt 될때의 시점을 따로 가지고 있는줄 알았는데

그냥 처음 StartCoroutine을 할 때의 entrypoint로 가버린다.

 

구글링 하다가 딱히 방도가 없어서

다음과 같은 방식으로 나 혼자 해결했다

 

float? lastSpawnTime = null;
float? interruptedTime = null;
bool isStoppedSpawnEnemy = false;

void StopSpawnEnemy()
{
    isStoppedSpawnEnemy = true;
    interruptedTime = Time.time;
}

IEnumerator SpawnEnemy()
{
    while(enemyCount < 10)
    {
    	if(isStoppedSpawnEnemy)
        	yield return new WaitUntil(() => isStoppedSpawnEnemy == false);
        if(interruptedTime != null)
        {
        	yield return new WaitForSeconds(2f - (interruptedTime.Value - lastSpawnTime.Value));
            interruptedTime = null;
        }
    	Instantiate(~);
        
        enemyCount++;
        lastSpawnTime = Time.time;
    	yield return new WaitForSeconds(2f);
    }
}

이렇게 StopCoroutine이 아니라 코루틴 자체에 Suspend를 걸어

멈춘 시간 차이만큼 좀 기다렸다가 다시 Spawn이 재개되게끔 할 수 있다.

 

 

저작자표시 (새창열림)

'etc > Unity' 카테고리의 다른 글

[Unity] UI 크기를 WorldSpace 기준으로 바꾸기  (0) 2022.02.25
[Unity] VS에서 Unity 메세지 띄우는 법  (0) 2021.07.12
[Unity] 코루틴, Coroutine이란?  (0) 2021.07.12
'etc/Unity' 카테고리의 다른 글
  • [Unity] UI 크기를 WorldSpace 기준으로 바꾸기
  • [Unity] VS에서 Unity 메세지 띄우는 법
  • [Unity] 코루틴, Coroutine이란?
imsongkk
imsongkk
이것저것 적어보는 개발 블로그
  • imsongkk
    이것저것
    imsongkk
  • 전체
    오늘
    어제
    • 분류 전체보기 (81)
      • 일상 (1)
      • Infra (21)
        • AWS (3)
        • Docker (8)
        • Kubernetes (9)
        • Terraform (1)
      • Trouble Shooting (9)
      • Back-End (18)
        • Spring Boot (2)
        • JPA (7)
        • HTTP 기본 (4)
        • DDD (3)
      • 소마 (4)
      • Programming (7)
        • 디자인 패턴 (7)
      • etc (19)
        • Unity (4)
        • Node.js (2)
        • React (1)
        • 리액트를 다루는 기술 (2)
        • C# (6)
        • Language (0)
        • Firebase (2)
        • 알고리즘 (1)
        • CS (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Git
    firestore
    EC2
    Firebase
    포트
    도메인
    Firebase Analytics
    Google Analytics
    clone
    3000
    Terraform #테라폼 #IaC #AWS CLI
    VPC #Subnet #NAT #Region #AZ #IGW
    소프트웨어 마에스트로 #소마 #SWM #소프트웨어 마에스트로 14기
    Push
    React
    Private
    Repository
    8080
    Pull
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
imsongkk
[Unity] 코루틴 일시정지시에 시점 복구하기
상단으로

티스토리툴바