본문 바로가기
개발/Unity

유니티 - 드래그로 오브젝트 Y축 회전하기 (Drag to Rotate Object in Y-axis)

by 피로물든딸기 2022. 4. 15.
반응형

Unity 전체 링크

 

드래그로 오브젝트 Y축 회전하기 (Drag to Rotate Object in Y-axis)
드래그로 오브젝트 위, 아래로 움직이기 (Drag Object in Y-Axis)

드래그로 오브젝트 움직이기 (Move GameObject with Drag)
드래그로 땅 위의 오브젝트 움직이기 (Drag and Move on the Ground)
드래그로 평면 위의 오브젝트 움직이기 (Drag and Move on the Plane)

드래그로 블럭 옆으로 한 칸 움직이기 (Drag GameObject Snapped to a Grid)


드래그를 이용하여 Y축 기준으로 오브젝트를 회전해보자.

회전할 오브젝트에 DragAndRotate 스크립트를 추가한다.

 

rotating이 true가 되면 Update에서 회전을 한다.

그리고 회전 속도와 마우스의 위치/변화, rotation 축을 위한 변수를 만든다.

    bool rotating;
    float rotateSpeed = 30.0f;
    Vector3 mousePos, offset, rotation;

 

마우스를 클릭하면 rotating은 true고 마우스를 떼면 false로 만든다.

최초 마우스를 클릭한 경우에 현재 마우스의 위치를 기억해둔다.

 

    void OnMouseDown()
    {
        rotating = true;

        mousePos = Input.mousePosition;
    }

    void OnMouseUp()
    {
        rotating = false;
    }

 

Update에서는 현재의 마우스 위치와 이전의 위치의 차이를 구한 후, y축만 Rotate로 회전한다.

회전 후, 현재 마우스 위치를 다시 기억해둔다.

    void Update()
    {
        if (rotating)
        {
            offset = (Input.mousePosition - mousePos);

            rotation.y = -(offset.x + offset.y) * Time.deltaTime * rotateSpeed;

            transform.Rotate(rotation);

            mousePos = Input.mousePosition;
        }
    }

 

오브젝트가 정상적으로 회전하는 것을 알 수 있다.

 

최종 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragAndRotate : MonoBehaviour
{
    bool rotating;
    float rotateSpeed = 30.0f;
    Vector3 mousePos, offset, rotation;

    void OnMouseDown()
    {
        rotating = true;

        mousePos = Input.mousePosition;
    }

    void OnMouseUp()
    {
        rotating = false;
    }

    void Update()
    {
        if (rotating)
        {
            offset = (Input.mousePosition - mousePos);

            rotation.y = -(offset.x + offset.y) * Time.deltaTime * rotateSpeed;

            transform.Rotate(rotation);

            mousePos = Input.mousePosition;
        }
    }
}

이제 회전의 각도를 제한해보자.

 

특정 각도로만 돌 수 있게 fixAngle을 추가한다. 여기서는 30º 단위로만 움직이도록 한다.

그리고 type casting을 이용하여 fixAngle의 배수로만 y값이 변하도록 코드를 수정한다.

이 작업은 마우스 클릭이 끝난 후에 변경하므로 OnMouseUp에서 처리를 한다.

    float fixAngle = 30.0f;

    ...
    
    void OnMouseUp()
    {
        rotating = false;
		
        /* 특정 각도로만 회전 */
        float yAngle = ((int)this.transform.localEulerAngles.y / (int)fixAngle) * fixAngle;
        Vector3 localEulerAngles = this.transform.localEulerAngles;

        localEulerAngles.y = yAngle;
        this.transform.localEulerAngles = localEulerAngles;
    }

 

오브젝트의 Rotation Y가 fixAngle(=30)의 배수로만 회전하는 것을 알 수 있다.

 

최종 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragAndRotate : MonoBehaviour
{
    bool rotating;
    float rotateSpeed = 0.5f;
    float fixAngle = 30.0f;
    Vector3 mousePos, offset, rotation;

    void OnMouseDown()
    {
        rotating = true;

        mousePos = Input.mousePosition;
    }

    void OnMouseUp()
    {
        rotating = false;

        float yAngle = ((int)this.transform.localEulerAngles.y / (int)fixAngle) * fixAngle;
        Vector3 localEulerAngles = this.transform.localEulerAngles;

        localEulerAngles.y = yAngle;
        this.transform.localEulerAngles = localEulerAngles;
    }

    void Update()
    {
        if (rotating)
        {
            offset = (Input.mousePosition - mousePos);

            rotation.y = -(offset.x + offset.y) * rotateSpeed;

            transform.Rotate(rotation);

            mousePos = Input.mousePosition;
        }
    }
}

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글