이번에는 캐릭터가 바라보는 방향으로 회전할 수 있도록 스크립트를 수정해보겠습니다.
캐릭터가 바라보는 방향을 알 수 있도록 3D Object에서 Cube를 하나 추가해준 후 다음과 같이 설정합니다. 그리고 Cube를 드래그하여 Player에 올리면 Cube가 Player의 자식으로 등록됩니다.
큐브가 돌출된 방향이 캐릭터가 바라보는 방향이 됩니다. 다음은 코드입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float Speed = 10.0f;
public float rotateSpeed = 10.0f; // 회전 속도
float h, v;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
// 이동 관련 함수를 짤 때는 Update보다 FixedUpdate가 더 효율이 좋다고 한다. 그래서 사용했다.
void FixedUpdate()
{
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v); // new Vector3(h, 0, v)가 자주 쓰이게 되었으므로 dir이라는 변수에 넣고 향후 편하게 사용할 수 있게 함
// 바라보는 방향으로 회전 후 다시 정면을 바라보는 현상을 막기 위해 설정
if (!(h == 0 && v == 0))
{
// 이동과 회전을 함께 처리
transform.position += dir * Speed * Time.deltaTime;
// 회전하는 부분. Point 1.
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), Time.deltaTime * rotateSpeed);
}
}
}
이전 코드에서 추가된 것은 rotateSpeed와 Vector3 dir, if문 그리고 transform.rotation입니다.
회전 속도 또한 public으로 처리하여 유니티 내에서 변경할 수 있게 만들었으며, Vector3 dir의 경우 new Vector(h, 0, v) 값을 받도록 만들었습니다. dir 변수를 생성한 이유는 주석에 적어두었습니다.
if문의 경우, 바라보는 방향으로 회전하면서 간 후 정지하면 다시 정면을 보는 현상을 방지하기 위함입니다.
Point 1.
다음은 주가 되는 회전에 관한 코드입니다.
rotation의 방향은 Quaternion을 사용하여 조작할 수 있습니다. Quaternion은 사원수(四元數)이며, 이에 대한 자세한 설명을 원하시는 분들은 hub1234.tistory.com/21 를 보시면 좋을 것 같습니다.
여기에서는 Lerp라는 내장함수를 사용하였습니다. Lerp는 움직임을 부드럽게 할 때 사용합니다. Lerp의 인자는
이렇게 되어있습니다. 간단히 .Lerp(회전각 a에서, 회전각 b까지, t의 속도로 회전)이라고 이해하시면 편합니다. 우리의 코드를 보면 "현재 회전각(transform.rotation)에서 바라보는 방향(Quaternion.LookRotation(dir)) 까지 우리가 지정한 회전속도(Time.deltaTime * rotateSpeed) (deltaTime은 속도 보정값)로 회전한다"임을 알 수 있습니다.
'Unity' 카테고리의 다른 글
[Unity] 캐릭터 이동 시 카메라 따라가기 (3인칭) (1) | 2021.04.09 |
---|---|
[Unity] 캐릭터 점프 시 벽에 붙는 현상 수정 (0) | 2021.04.04 |
[Unity] 충돌처리 (0) | 2021.04.03 |
[Unity] 캐릭터 점프 (0) | 2021.04.03 |
[Unity] 캐릭터 이동 (2) | 2021.04.03 |