모르던 걸 하나씩 줄여가는 중입니다.
게임 개발과 웹, 그리고 읽은 책까지. 공부하다 막힌 것과 풀어낸 방법을 하나씩 적어둡니다.
원점에서 멀어지면 떨리는 이유
오픈월드에서 원점에서 수십 km 떨어지면 캐릭터와 카메라가 덜덜 떨립니다. float 는 큰 수일수록 표현할 수 있는 값 사이가 벌어져서, 작은 움직임이 반올림으로 사라지거나 부풀기 때문입니다. 세상을 원점 쪽으로 다시 옮겨서 막습니다.
빠른 총알이 벽을 뚫고 지나가는 이유
물리는 0.02초마다 그 순간의 자리만 보고 겹쳤는지 검사합니다. 한 걸음에 가는 거리가 벽 두께보다 크면, 벽 앞과 벽 뒤만 보고 부딪힌 적이 없다고 판단합니다. 연속 충돌 검사와 레이캐스트로 그 사이를 메웁니다.
리지드바디가 떨려 보이는 이유
물리는 1초에 50번 움직이고 화면은 그보다 자주 그리니, Rigidbody 는 몇 프레임 제자리에 있다가 한 번에 뜁니다. deltaTime 으로는 안 고쳐지고, Interpolate 가 직전 두 물리 위치 사이를 메워 그려서 고칩니다.
FixedUpdate 가 따로 도는 이유
유니티 물리는 화면 프레임과 상관없이 0.02초마다 한 번씩 계산합니다. 프레임마다 지난 시간을 모아 두었다가 0.02초씩 덜어 내며 FixedUpdate 를 부르기 때문에, 한 프레임에 0번 불리기도 하고 두 번 불리기도 합니다. 간격을 고정하는 이유와 그 때문에 생기는 입력 씹힘을 숫자로 따라갑니다.
점프가 포물선이 되는 이유
중력은 위치가 아니라 속도를 바꿉니다. 매 프레임 속도에 중력을, 위치에 속도를 더하면 포물선이 나옵니다. 속도 · 가속도 · 포물선을 작은 숫자로 처음부터 따라가고, 계산 간격이 크면 점프 높이가 달라지는 이유와 원하는 높이로 뛰게 하는 처음 속도 √(2gh) 까지 봅니다.