게임 과제 중 비트세이버를 클론코딩하는 과제가 있었다.
그 중 박스를 휘두를 경우 오브젝트가 둘로 나뉘는 효과를 주고 싶어 찾아보았다.
다음과 같은 효과를 주고싶었고
https://www.youtube.com/watch?v=GQzW6ZJFQ94&t=898s
다음 유튜브 영상을 참고하여 구현하던 중 잘 적용될때도 있고 안될 때도 있는 이슈를 발견하였다.
로그를 찍어보며 찾아보다가,
프레임을 저장하고 칼의 속도를 측정하는 스크립트에서 코루틴이 비정상적임을 발견하였다.
Awake() 함수에서 코루틴 함수를 호출하고
코루틴은 yield return new WaitForEndOfFrame(); 라는 함수를 호출하고 있었다.
여기서 문제는 WaitForEndOfFrame() 이 함수가 Awake() 함수에서 사용시 문제가 발생할 수 있다는 것이었다.
실제 문제:
Unity 커뮤니티에서 보고된 실제 문제는 WaitForEndOfFrame()이 특정 상황에서 예상과 다르게 동작하는 것으로, 이는 렌더링 파이프라인과 프레임 타이밍의 복잡한 상호작용 때문입니다. Unity DiscussionsUnity Discussions 특히 Unity Tests나 배치 모드에서 WaitForEndOfFrame()이 제대로 동작하지 않는 것으로 알려져 있습니다. Do not use WaitForEndOfFrame - Unity Engine - Unity Discussions
올바른 해결 방법:
Awake()에서 Start()로 코루틴을 이동시키는 것은 좋은 해결책입니다. 왜냐하면 "모든 객체의 Awake와 OnEnable이 완료된 후 Start가 호출되기 때문"입니다.
관련 링크:
Unity 공식 실행 순서 문서
WaitForEndOfFrame 실행 순서 문제
Unity 스크립트 실행 순서 버그
결론: 문제 해결 방법은 맞지만, 원인 분석에서 카메라 초기화와 관련된 부분은 정확하지 않습니다. 실제로는 Unity의 스크립트 실행 순서와 WaitForEndOfFrame()의 내부 동작 방식의 문제입니다.
그렇다면, Awake() 될때 카메라가 인스턴스화가 되기전에 WaitForEndOfFrame()함수가 실행 되지 않을 수 있다는 가능성을 이야기한다.
따라서, 해결방법은 Awake에 있던 Corutine 함수를 Start로 옮겨 주었다.