inflearn logo
강의

講義

知識共有

유니티 쿨타임 코루틴활용 질문

902

chjjang258585

投稿した質問数 1

0

플레이어가 여러가지 스킬의 투사체를 소환해 날리는 타입으로 공격합니다.

게임 진행 중에 스킬을 획득하고, 스킬을 획득하면 스킬의 Id 값을 매개변수로 활용하여

코루틴을 실행합니다. while 문 안에 스킬의 해당 투사체 소환 함수를 실행하고 해당 스킬의 쿨타임만큼 WaitForSeconds 를 실행하고 있습니다.

그런데 게임을 진행 중에 일시정지 했을 때, 문제가 생깁니다.

처음엔 while문 안에서 만약 일시정지 상태라면 yield return null 로 넘어가는 방식으로

작성했습니다. 예를 들면 쿨타임이 3초인 스킬이 있는데 소환하고 1초가 지난 후에, 일시정지가 되었다면 일시정지가 풀린 후에 2초가 지나는게 아닌, 일시정지 상태에서도 시간이 흐릅니다.

그래서 일시정지가 풀리면 바로 소환합니다. 일시정지 직전 소환한 오브젝트가 있으니, 중복생성 된 것처럼 연출이 나옵니다.

 

그래서 소환 실행함수 안에서 일시정지상태라면 return 시켜 소환을 취소하는 방식으로 했습니다. 타이밍에 따라서 소환을 스킵해서 쿨타임이 길어지고, 결국 원하는 연출은 나오지 않더군요ㅠㅠ
여러가지 스킬을 굴리다보니 코루틴을 사용했는데, 다른 방식으로 해야 효과적으로 쿨타임을 관리할 수 있을까요?

유니티 unity

回答 1

0

communityai8509

안녕하세요, 인프런 AI 인턴이에요. 유니티에서 일시정지 상태에서 쿨타임이 흐르는 동안 플레이어의 스킬을 제어하는 방법에 대해 궁금하신 것 같습니다.

일시정지 상태에서 시간이 멈추는 것처럼 쿨타임도 멈추게 하기 위해서는 WaitForSeconds를 사용할 수는 없습니다. 대신 코루틴을 진행하는 동안 Time.deltaTime 값을 더해 쿨타임을 체크해야 합니다.

float skillCooldown = 3.0f;
bool isPaused = false;

IEnumerator SkillCooldown()
{
    float currentTime = 0.0f;

    while (currentTime < skillCooldown)
    {
        // 일시정지 상태이면 시간에 Time.deltaTime을 더하지 않고 건너뛴다
        if (isPaused)
        {
            yield return null;
            continue;
        }

        currentTime += Time.deltaTime;
        yield return null;
    }

    // 쿨타임이 끝났을 때 처리하는 부분
    // 스킬을 소환하거나 원하는 연출을 실행한다
}

위의 예제 코드에서는 isPaused라는 변수로 게임의 일시정지 상태 여부를 체크합니다. 일시정지 상태인 경우 Time.deltaTime을 더하지 않고 yield return null로 건너뛰기 때문에 일시정지 상태에서는 쿨타임이 멈추게 됩니다. 일시정지가 풀리면 쿨타임이 다시 흘러갑니다.

소환 실행 함수 내에서 일시정지 상태라면 코루틴을 멈추는 방법보다는 위와 같이 쿨타임 체크를 할 때 일시정지 상태를 확인하고 건너뛰는 방식을 사용하는 것이 좋습니다. 이렇게 하면 일시정지 직전에 소환한 오브젝트가 중복 생성되는 문제를 해결할 수 있을 것입니다.

만약 스킬마다 쿨타임이 다르다면, skillCooldown 변수를 스킬마다 따로 저장하고 코루틴을 실행할 때 해당 스킬의 쿨타임을 인자로 전달해주는 방식으로 구현하면 됩니다.

이와 관련된 더 자세한 내용은 Unity의 공식 문서 또는 유니티 개발자 커뮤니티를 참고하시면 도움이 될 것입니다. 질문이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!

영상이 안나옵니다. 그냥 빈공간이에요

1

14

3

layout group의 종류 3가지 실무 적합활용이 궁금합니다.

0

14

1

수박게임 자료 받았는데 plante05, 06이 없습니다.

0

28

1

14강 녹음이 안되어 있습니다

0

41

1

유니티webgl 과 안티그래비티를 협업시키고 싶습니다.

0

49

2

소스를 받을 수 있는 링크가 있을까요?

0

78

2

프로덕션 부분 사용 불가

0

78

2

접근지정자

0

73

2

in-app purchasing 버튼의 install 버튼이 비활성화되어있을때 어떻게 해결해야하나요 ?

0

59

2

유니티 제외 설치한 프로그램들 및 파일 삭제 방법

0

64

1

깃허브에서 콤피유아이 매니저 설치하는게 안됩니다.

0

87

2

5강, 오류 수정과 관련해서

0

72

2

컴퓨터를 껐다가 클로드 코드 다시 키는 방법 알려주세요.

0

76

1

MA-POCA 알고리즘 응용 질문

0

53

1

Pivot을 마우스로 클릭하고 드래그해도 움직이 않아서 혹시 아시는 부분이 있나 해서 문의 남깁니다.

0

66

1

카메라가 많아지면 렌더링 비용이 커지나요?

0

51

1

3:56에 폰트 불러온 과정이 궁금합니다 ㅠㅠ

0

83

3

Spider와 Monster 구현 방식을 구분한 이유

1

47

1

Sprute Sheet에 대해서.

0

75

1

ResourceManager 클래스 관련 질문

1

89

2

FBX chan 모델

0

86

1

첨부된 수업자료와 강의 내용이 다릅니다.

0

124

2

몬스터 HP 게이지바 이동

0

61

1

TextMeshPro용 커스텀 한글 2350자.txt 파일은 어디에 있나요?

0

75

1