이번에 작은 게임에 액션 요소가 포함되었기에
피격 후 3초 간 무적, 그 표시로 캐릭터 깜빡임을 코루틴으로 아래와 같이 처리하였습니다.
하지만 에디터에서는 잘 동작하던 구문이
pc 빌드에서는 약 5초,
안드로이드 빌드에서는 약 10초
무적이 아주 길게 지속되는 이상 현상을 보였습니다.
검색해보니 유니티 포럼에서 WaitForSeconds(t)의 매개 변수로 들어가는 t (대기 시간)에 소숫점 아주 낮은 수를 쓰지 말라는 댓글을 발견할 수 있었습니다.
그 근거를 찾기 위해 해당 매서드의 소스 코드를 찾아봤으나 공식 소스는 찾지 못했고
맨 아래의 참고 메뉴얼을 통해 매 프레임마다 WaitForSeconds()를 호출하는 것을 보고 가설을 세울 수 있었습니다.
위의 소스 코드에서 사용한 0.01f는 실제로 약간의 오차를 포함합니다.
이벤트 함수의 한바퀴 실행 시간을 단순하게 봐도 1/60초 = 0.0167f
이것보다 적은 값이라 누적하여 t = 0.01f를 만들 수 없기에 실행한 환경에 따라 오차가 발생했으며
300번 누적으로 인해 작은 오차들이 더해진 값이 크게 달라지지 않았나 생각합니다.
따라서, 이를 해결하기 위해 아래와 같이 코드를 수정하였습니다.
계산 속도가 다른 환경에서도 동일한 값을 낼 수 있게 0.01f 같은 모호한 값이 아닌
Fixed Update 주기인 0.02초 대기를 최소 단위로 사용하니 모든 환경에서 동일한 시간의 무적이 동작하였습니다.
결론은 아래와 같습니다.
yield return null; 과 같은 1프레임 대기,
WaitForFixedUpdate()와 같은 0.02초 대기
를 최소 단위로 이용하여 처리하는 것이 좋습니다.
혹은
WaitForSeconds() 매개변수 t는 최소 소숫점 한자리 0.1f까지만 사용
유니티 공식 매뉴얼에도 1프레임마다 처리할 필요가 없는 무거운 계산에는 0.1f 마다 계산하라고 권장하는 것으로 보아 적어도 해당 시간까지는 1프레임 실행 시간을 누적하여 오차를 최소화하는 장치가 마련되어 있으리라 봅니다.
참고 문헌
https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html
이벤트 함수의 실행 순서 - Unity 매뉴얼
Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.
docs.unity3d.com
'Unity 에러 노트' 카테고리의 다른 글
TextMeshPro 텍스트에 반투명한 네모가 나타날 때 (0) | 2024.11.20 |
---|---|
게임 오브젝트 비활성화 후 다시 활성화 시 애니메이터 파라미터 값 초기화 (0) | 2024.10.01 |
유니티) 갤럭시 s24 시리즈와의 앱 호환성 문제 (0) | 2024.03.12 |
Edge Collider 2D 스크립팅 툴팁 오기 (0) | 2024.03.10 |
인스펙터에 스크립트 활성/비활성 체크 박스 사라짐 (0) | 2023.10.12 |