Learning
When: 1학년 5월 1일
How:
학기 초에 오브젝트가 움직이는 방식을 여러 가지 배웠는데, 복습도 하고 조금 더 깊게 파보기 위해 공부를 해보았습니다.
Understanding:
제가 알고 있는 대표적인 오브젝트의 이동은 transform.position +=에 Vector로 된 위치 값을 더해주어 마치 오브젝트를 들었다가 그곳에 놓는 이동 방식과, linearVelocity =에 Vector로 된 속도를 표현하는 벡터를 대입하여 물체가 FixedUpdate마다 벡터의 방향과 속도만큼 이동하게 만드는 이동 방식입니다.
보통 물체가 이동할 때는 그 물체와 상호작용하는 다른 물체가 있기 마련이기 때문에 물리 엔진이 관여하는 linearVelocity를 보통 사용하고, 물체를 어딘가로 이동시킬 때는 transform.position으로 이동시키는 것으로 알고 있었는데, 그것이 틀린 것은 아니지만 linearVelocity에는 조금 더 어려운 개념이 있었습니다.
일단 linearVelocity는 속도를 조정해줄 수 있는데, 이때 프레임마다 계산되는 과정이 있습니다. 첫 번째로, 저번 프레임과 지금 프레임의 오브젝트 위치를 보고 다음 프레임에 갈 위치를 예측하고, 그 거리를 갈 만큼의 속도를 설정합니다. 그 후에 그 설정된 속도에 중력이나 마찰력 같은 외부 물리 연산을 수행한 후에 움직입니다.
여기서 중요한 점은 이동 전 위치 예측을 기반으로 충돌 검사를 먼저 수행한 뒤, 실제 이동이 이루어진다는 것입니다. 이렇게 되면 transform.position을 이용한 이동과 다를 바가 없다고 생각될 수도 있지만, transform.position은 충돌이 일어나든 말든 그냥 계속 한 방향으로 순간이동을 할 뿐입니다.
반면 linearVelocity를 사용하면, 설정한 그 다음 프레임에서 제가 설정한 속도만큼 움직이고, 충돌 연산을 통해 벽에 막히거나 튕길 수 있으며, 다음 프레임으로 넘어가기 전에 중력이나 마찰력 등 물리 연산이 수행된 후 속도가 바뀌고, 그에 해당하는 위치로 이동합니다. 그리고 이 과정이 반복됩니다.
저는 여기서 제가 linearVelocity 값을 바꾸었을 때, 물리 연산을 어떻게 하는지 잘 몰랐는데, 중력이나 다른 물리 연산을 수행한 후에 그 값을 제가 입력한 속도에 +, - 형식으로 적용한다는 사실을 알게 되었습니다. 그러므로 FixedUpdate에 속도를 Vector(0, 0, 0)으로 고정하려고 해도, 물리 연산이 한 번은 반드시 반영된다는 사실을 알게 되었습니다.
Result: FixedUpdate에 속도를 Vector(0,0,0)으로 고정하려고 해도 중력이 한 번은 반영됩니다. FixedUpdate 실행 -> 물리연산 -> 다음 프레임의 위치가 정해집니다.
'UnityEngine' 카테고리의 다른 글
| [Unity] 코드에서 GameObject 가져오기 (0) | 2025.05.06 |
|---|---|
| [Unity] OnTrigger, OnCollision 메서드 실행 (0) | 2025.05.02 |
| [Unity] Monobehaviour 스크립트의 구동 (0) | 2025.04.28 |
| [Unity] 오브젝트 코드로 회전시키기 (0) | 2025.04.27 |
| [Unity] 게임 오브젝트 회전 순서 (0) | 2025.04.26 |