본문 바로가기

Unity

Unity 오브젝트 클릭해서 회전시키기 #Rotate #FixedUpdate()

드래그한 방향으로 오브젝트를 회전시키는 방법! 유튜브 튜토리얼 영상을 따라 만들어 보았다.

그런데 이 튜토리얼을 따라 하며 간과한 것이 있다.

실행환경이 다른경우 터치나 클릭을 인식할 때 '마우스 클릭 = 모바일 터치'로 자동으로 호환이 되는 줄 알았는데 

그게 가능한 메서드와 아닌 메서드가 별도로 있다는 것이다. (왜 당연하다 생각했을까..?)

 

그래서 아래와 같이 기능을 구현했을 때 모바일에서도 정상 작동을 하는지 정확히 모르겠다... 😭

정확히 확인해본 뒤 업데이트 할 예정이다!  

 


시작! 🍙

 

 

 

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