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

23.09.06 14:50 작성 조회수 366

0

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

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

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

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

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

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

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

 

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

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.07

안녕하세요, 인프런 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의 공식 문서 또는 유니티 개발자 커뮤니티를 참고하시면 도움이 될 것입니다. 질문이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!