드래그로 오브젝트 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:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 게임 씬 화면 조작 및 단축키 (0) | 2022.04.24 |
---|---|
유니티 - [오늘의 집] 오브젝트를 움직일 때 좌표축 만들기 (Line Renderer) (2) | 2022.04.16 |
유니티 에디터 - OnDrawGizmos / OnDrawGizmosSelected로 Scene에 선 그리기 (1) | 2022.04.14 |
유니티 - 드래그로 카메라 이동(Drag and Move Camera) (0) | 2022.04.14 |
유니티 - 드래그로 오브젝트 위, 아래로 움직이기 (Drag Object in Y-Axis) (1) | 2022.04.14 |
댓글