Unity
Unity 오브젝트 클릭해서 회전시키기 #Rotate #FixedUpdate()
여르므
2024. 8. 17. 16:51

드래그한 방향으로 오브젝트를 회전시키는 방법! 유튜브 튜토리얼 영상을 따라 만들어 보았다.
그런데 이 튜토리얼을 따라 하며 간과한 것이 있다.
실행환경이 다른경우 터치나 클릭을 인식할 때 '마우스 클릭 = 모바일 터치'로 자동으로 호환이 되는 줄 알았는데
그게 가능한 메서드와 아닌 메서드가 별도로 있다는 것이다. (왜 당연하다 생각했을까..?)
그래서 아래와 같이 기능을 구현했을 때 모바일에서도 정상 작동을 하는지 정확히 모르겠다... 😭
정확히 확인해본 뒤 업데이트 할 예정이다!
시작! 🍙
1. 오브젝트 만들기
큐브 오브젝트 6개를 만든다. Scale값은 2로 설정했다.

2. Rigidbody 컴포넌트 추가
1. 큐브 오브젝트 Inspector > Add Component > Rigidbody
2. Mass: 0.7
3. Drag: 0.1
4. Angular Drag: 0.1
5. Use Gravity: 비활성화

3. 머터리얼 할당
1. Project > Create > New Material
2. 머터리얼 색상 설정
3. Cube > Mesh Renderer > 머터리얼 할당

4. Rotator 스크립트 작성
public class Rotator : MonoBehaviour
{
[SerializeField]
private float rotationSpeed = 100; // 회전 속도
private bool isDragging = false;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetMouseButtonUp(0))
{
isDragging = false;
}
}
private void FixedUpdate()
{
if (isDragging)
{
float xDirection = Input.GetAxis("Mouse X") * rotationSpeed * Time.fixedDeltaTime;
float yDirection = Input.GetAxis("Mouse Y") * rotationSpeed * Time.fixedDeltaTime;
rb.AddTorque(Vector3.down * xDirection);
rb.AddTorque(Vector3.right * yDirection);
}
}
private void OnMouseDrag()
{
isDragging = true;
}
}
4-1. 스크립트 설명
더보기
float xDirection = Input.GetAxis("Mouse X") * rotationSpeed * Time.fixedDeltaTime;
float yDirection = Input.GetAxis("Mouse Y") * rotationSpeed * Time.fixedDeltaTime;
- 마우스의 X축, Y축 이동 방향에 따른 회전값을 구한다.
- rotationSpeed: 회전 속도
- Time.fixedDeltaTime: 물리 엔진이 업데이트 되는 주기(프레임 레이트와 무관하계 일관적)
rb.AddTorque(Vector3.down * xDirection);
rb.AddTorque(Vector3.right * yDirection);
- X축, Y축 방향으로 회전시킨다.
Update() vs FixedUpdate()
주요 차이점
- FPS와의 독립성
Update()
- 기기의 프레임 레이트에 따라 호출 주기가 변화한다.
- 용도: 입력 처리, 일반 게임 로직(예: WASD이동, 마우스클릭 총알발사, 걷거나 달리는 애니메이션 등)
FixedUpdate()
- 기기의 프레임 레이트와 무관하게 일정한 시간 간격으로 호출된다. (예: 0.02초마다)
- 일정한 시간 간격으로 호출되어 물리 연산을 일관되게 처리한다.
- 용도: 물리 연산 (예: 중력, 충돌 처리)
❓물리 연산 시 FixedUpdate()를 사용하는 이유
일관된 물리 연산
- 프레임 레이트와 무관하게 일정한 시간 간격으로 호출되므로, 물리 연산 작업이 일관적으로 유지된다.
- AddTorque()와 같은 물리 엔진 관련 메서드를 FixedUpdate에서 사용하면, 물리 엔진의 동기화와 충돌이 정확하게 처리된다.
Rigidbody의 Mass, Drag, AngularDrag
Mass: 질량
높은 질량: 물체가 무거워져 동일한 힘 적용 시 더 적은 가속도를 갖게 되고 충돌 시에 강하게 반응한다.
낮은 질량: 물체가 가벼워져 동일한 힘 적용 시 더 빠른 가속도를 갖게 되고 충돌 시에 약하게 반응한다.
Drag: 이동 속도에 대한 저항
높은 Drag: 물체가 이동할 때 더 많은 저항을 받아서, 속도가 더 빨리 줄어든다. 즉 물체의 움직임이 더 느려진다.
낮은 Drag: 저항이 적어져서 물체가 더 오랜 시간 동안 이동할 수 있다.
Angular Drag: 회전에 대한 저항값
높은 Angular Drag: 물체가 회전할 때 더 많은 저항을 받아서 회전 속도가 더 빨리 줄어든다. 회전이 멈추는 데 시간이 오래 걸림
낮은 Angular Drag: 회전에 대한 저항이 적어져서, 물체가 오랜 시간 동안 회전한다.
참고 링크
Best way to rotate a 3D object smoothly with mouse or touch in Unity