본문 바로가기

Unity

[Unity] 캐릭터가 바라보는 방향으로 회전

이번에는 캐릭터가 바라보는 방향으로 회전할 수 있도록 스크립트를 수정해보겠습니다.

 

캐릭터가 바라보는 방향을 알 수 있도록 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 를 보시면 좋을 것 같습니다.

 

[유니티] Euler, Quaternion 오일러각 쿼터니언 총 정리

[Unity] Euler, Quaternion 오일러각(짐벌락) 쿼터니언에 대하여! Unity의 Euler 각도는 x,y,z 3개 축을 기준으로 회전시키는 우리가 흔히 알고있는 각도계를 의미한다. 이 각도계를 사용하면 우리 모두 삽

hub1234.tistory.com

 

여기에서는 Lerp라는 내장함수를 사용하였습니다. Lerp는 움직임을 부드럽게 할 때 사용합니다. Lerp의 인자는

이렇게 되어있습니다. 간단히 .Lerp(회전각 a에서, 회전각 b까지, t의 속도로 회전)이라고 이해하시면 편합니다. 우리의 코드를 보면 "현재 회전각(transform.rotation)에서 바라보는 방향(Quaternion.LookRotation(dir)) 까지 우리가 지정한 회전속도(Time.deltaTime * rotateSpeed) (deltaTime은 속도 보정값)로 회전한다"임을 알 수 있습니다.