안녕하세요, 인친님들! 오늘은 Unity에서 캐릭터를 회전시키는 다양한 방법에 대해 아주 자세히 알아보겠습니다.
Unity와 회전의 기본 개념
Unity에서 모든 게임 오브젝트는 'Transform' 컴포넌트를 가지고 있습니다. 이 Transform은 오브젝트의 위치(Position), 회전(Rotation), 크기(Scale)를 결정합니다. 회전을 다룰 때, 우리는 주로 이 Transform 컴포넌트를 이용하게 됩니다.
회전의 기본 단위는 '도(degree)'입니다. 360도가 한 바퀴를 의미하죠. Unity에서는 이를 왼손 좌표계로 표현합니다. 즉, 엄지손가락을 위로 했을 때 손가락이 구부러지는 방향이 양의 회전 방향입니다.
- X축 회전: 좌우로 기울이기 (Roll)
- Y축 회전: 좌우로 돌리기 (Yaw) - 가장 흔히 사용됨
- Z축 회전: 앞뒤로 기울이기 (Pitch)
기본적인 캐릭터 회전
가장 간단한 방법부터 시작해봅시다. Transform.Rotate 함수를 사용하면 쉽게 캐릭터를 회전시킬 수 있습니다.
using UnityEngine;
public class CharacterRotator : MonoBehaviour
{
public float rotationSpeed = 100f; // 회전 속도 (도/초)
void Update()
{
// Y축을 중심으로 회전
transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
}
}
이 코드를 하나씩 뜯어볼까요?
public float rotationSpeed = 100f;: 회전 속도를 설정합니다. 초당 100도를 의미합니다. public으로 선언되어 Unity 에디터에서 쉽게 수정할 수 있어요.transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);:Vector3.up은 Y축을 의미합니다. Y축을 중심으로 회전한다는 뜻이에요.rotationSpeed * Time.deltaTime은 프레임에 상관없이 일정한 속도로 회전하게 해줍니다.Time.deltaTime은 이전 프레임부터 현재 프레임까지의 시간을 초 단위로 나타냅니다.
이 스크립트를 Unity에서 사용하려면:
- Unity 에디터에서 새 C# 스크립트를 만들고 이름을 'CharacterRotator'로 지정합니다.
- 스크립트를 더블클릭하여 열고, 내용을 위 코드로 바꿉니다.
- 회전시키고 싶은 캐릭터 오브젝트에 이 스크립트를 드래그앤드롭합니다.
- Play 버튼을 누르면 캐릭터가 회전하는 것을 볼 수 있습니다!
입력에 따른 회전
게임에서는 보통 플레이어의 입력에 따라 캐릭터가 회전해야 합니다. 키보드 입력으로 캐릭터를 회전시켜 볼까요?
using UnityEngine;
public class CharacterRotator : MonoBehaviour
{
public float rotationSpeed = 100f; // 회전 속도 (도/초)
void Update()
{
// 수평 입력 값을 가져옵니다 (-1 ~ 1 사이의 값)
float horizontalInput = Input.GetAxis("Horizontal");
// 입력 값에 따라 회전합니다
transform.Rotate(Vector3.up, horizontalInput * rotationSpeed * Time.deltaTime);
}
}
이 코드의 핵심은 Input.GetAxis("Horizontal")입니다.
- 이 함수는 키보드의 A, D 키 또는 왼쪽, 오른쪽 화살표 키의 입력을 감지합니다.
- A 키나 왼쪽 화살표를 누르면 -1, D 키나 오른쪽 화살표를 누르면 1, 아무것도 누르지 않으면 0을 반환합니다.
- 이 값을 회전 속도와 곱해 회전 방향과 속도를 결정합니다.
이 스크립트를 사용하면, 키보드로 캐릭터를 좌우로 회전시킬 수 있습니다.
목표 방향으로 회전
게임에서 적이나 아이템을 향해 캐릭터가 자동으로 돌아보게 하고 싶을 때가 있죠. 이럴 때는 Quaternion.Slerp 함수를 사용합니다.
using UnityEngine;
public class CharacterRotator : MonoBehaviour
{
public float rotationSpeed = 5f; // 회전 속도
public Transform target; // 목표 오브젝트
void Update()
{
if (target != null)
{
// 목표 방향 계산
Vector3 direction = (target.position - transform.position).normalized;
// 목표 방향을 바라보는 회전 계산
Quaternion lookRotation = Quaternion.LookRotation(direction);
// 현재 회전에서 목표 회전으로 부드럽게 보간
transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
}
}
}
이 코드를 자세히 살펴볼까요?
Vector3 direction = (target.position - transform.position).normalized;- 캐릭터에서 목표 지점으로의 방향을 계산합니다.
normalized는 이 방향의 길이를 1로 만들어 순수한 방향만 남깁니다.
Quaternion lookRotation = Quaternion.LookRotation(direction);- 계산된 방향을 바라보는 회전을 생성합니다.
- Quaternion은 3D 공간에서의 회전을 나타내는 특별한 방식입니다.
transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);- Slerp는 '구면 선형 보간'의 약자로, 두 회전 사이를 부드럽게 전환합니다.
- 현재 회전에서 목표 회전으로 부드럽게 변화하게 해줍니다.
이 스크립트를 사용할 때는 Unity 에디터에서 'target' 필드에 목표 오브젝트를 드래그앤드롭으로 지정해주어야 합니다.
회전 속도 감속
때로는 캐릭터가 회전을 시작한 후 점차 느려지게 하고 싶을 수 있습니다. 이런 효과는 캐릭터의 움직임을 더 자연스럽게 만들어줍니다.
회전 속도를 줄이기 위해서는 감쇠 계수(예: 0.96)를 곱하면 됩니다. 이를 통해 부드럽게 감속할 수 있습니다!!
using UnityEngine;
public class CharacterRotator : MonoBehaviour
{
public float initialRotationSpeed = 100f; // 초기 회전 속도 (도/초)
public float decelerationFactor = 0.96f; // 감속 계수
private float currentRotationSpeed;
void Start()
{
currentRotationSpeed = initialRotationSpeed;
}
void Update()
{
// 현재 회전 속도로 캐릭터 회전
transform.Rotate(Vector3.up, currentRotationSpeed * Time.deltaTime);
// 회전 속도 감속
currentRotationSpeed *= decelerationFactor;
// 회전 속도가 너무 작아지면 정지
if (currentRotationSpeed < 0.1f)
{
currentRotationSpeed = 0f;
}
}
}
이 코드의 핵심 부분을 설명해드릴게요:
public float decelerationFactor = 0.96f;- 이 값은 매 프레임마다 현재 속도에 곱해집니다.
- 1보다 작은 값이므로 속도가 점점 줄어들게 됩니다.
currentRotationSpeed *= decelerationFactor;- 매 프레임마다 현재 회전 속도를 감소시킵니다.
'1인 개발 게임 (Unity) > UNITY' 카테고리의 다른 글
| [UNITY] 컴포넌트란? (오브젝트에 성질/기능 추가하기) (2) | 2024.08.07 |
|---|---|
| [UNITY] 마우스 커서의 위치 받아오기 (mousePosition메소드) (1) | 2024.08.07 |
| [UNITY] 프레임 관리 -> 캐릭터의 이동 속도 FPS와 무관하게 설정하기 (2) | 2024.08.07 |
| [Unity] 게임 오브젝트의 좌표 -> transform.position, Find 메서드 (2) | 2024.07.18 |
| [Unity]드래그 길이 에 따라 이동거리 설정하기 (+ MousePosition 메서드) (2) | 2024.07.18 |