inflearn logo
강의

講義

知識共有

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

884

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

싱글턴패턴

0

11

1

코드 관련 질문

0

21

2

섹션7 수업자료 업로드 부탁드립니다.

0

24

2

Dictionary Key를 int에서 string으로 변경한 이유에 대한 문의

0

20

1

UI 기능 관련 질문이 있습니다!

0

37

2

03-01 (16. CharacterController)

0

31

2

TLS 질문드립니다.

0

43

2

Task 구현 28:36 Equals 에서 잘 모르는 부분이 있습니다.

0

27

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

48

2

픽셀 좌표 스크린 좌표

0

33

0

Locomotion랑 Turn 이 꼭 부모 자식 관계일 필요가 있나요?

0

25

1

LobbyUIController의 백키가 사라졌는데 왜그런건가요?

0

42

2

무조건 타이틀 씬부터 시작해야하나요?

0

41

1

BaseUI, UIManager

0

51

3

프로젝트 완성본 문의

0

41

2

Unity Span

0

76

2

씬 배치 구조에서 Addressables를 어떻게 적용해야 하는지 궁금합니다.

0

55

1

39. Main화면 추가 UI 에서 자료는 어디서 받나요??

0

38

1

Scene 전환에서

0

29

1

전체적으로 코드 읽는게 굉장히 오래 걸리네요...

0

75

2

사전학습 강의

0

57

1

3d프로젝트에 적용해도 무방한가요?ㅁ

0

71

2

VR기기 실행시 컨트롤러 rotation이 계속 거꾸로 초기화됩니다.

0

69

2

추후에 이 내용에 대해서 실질적인 게임개발에 들어가면서 복습하는 시간이 있을까요.

0

91

2