RotateTest.cs

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class RotateTest : MonoBehaviour
{
    // 회전 속도를 조절할 수 있는 public 변수입니다.
    public float turnSpeed = 5f;

    // 회전할 때 바라볼 목표 대상(타겟)입니다.
    public Transform target;

    void Start()
    {
        // Start 함수는 게임이 시작될 때 한 번만 호출됩니다.
        // 여기에 초기 회전값 설정 코드를 넣을 수 있습니다.
        // 주석된 코드들은 각각 Y, X, Z축으로 회전값을 설정하는 예제입니다.

        // Y축으로 -90도 회전
        // this.transform.rotation = Quaternion.Euler(0f, -90f, 0f);

        // X축으로 90도 회전
        // this.transform.rotation = Quaternion.Euler(90f, 0f, 0f);

        // Z축으로 90도 회전
        // this.transform.rotation = Quaternion.Euler(0f, 0f, 90f);
    }

    void Update()
    {
        // Update 함수는 매 프레임마다 호출됩니다. 따라서 회전 로직을 여기에 넣으면 실시간으로 객체가 회전합니다.

        // 아래 주석된 코드들은 특정 축을 기준으로 객체를 회전시키는 예제입니다.
        // x 값을 증가시키면서 객체를 회전시킬 수 있습니다.

        // float x = 0f;
        // x += 1;
        // Y축 기준 회전
        // this.transform.rotation = Quaternion.Euler(0f, x, 0f);
        // X축 기준 회전
        // this.transform.rotation = Quaternion.Euler(x, 0f, 0f);
        // Z축 기준 회전
        // this.transform.rotation = Quaternion.Euler(0f, 0f, x);

        // 이 부분은 객체를 특정 축을 기준으로 회전시키는 예제입니다.

        // Y축 기준 회전 (Vector3.up은 (0, 1, 0) 벡터를 의미)
        // this.transform.Rotate(Vector3.up * Time.deltaTime * turnSpeed);

        // X축 기준 회전 (Vector3.right는 (1, 0, 0) 벡터를 의미)
        // this.transform.Rotate(Vector3.right * Time.deltaTime * turnSpeed);

        // Z축 기준 회전 (Vector3.forward는 (0, 0, 1) 벡터를 의미)
        // this.transform.Rotate(Vector3.forward * Time.deltaTime * turnSpeed);

        // RotateAround는 객체가 타겟을 중심으로 회전하도록 만듭니다. 
        // 여기서는 타겟의 위치를 중심으로 Y축(Vector3.up)을 기준으로 회전합니다.
        // 지구가 태양 주위를 도는 것(공전)과 유사한 방식입니다.
        // transform.RotateAround(target.position, Vector3.up, turnSpeed * Time.deltaTime);

        // 다음은 타겟을 바라보도록 객체를 회전시키는 로직입니다.

        // 1. 타겟을 향하는 방향 벡터를 계산합니다.
        Vector3 dir = target.position - transform.position;

        // 2. 방향 벡터를 기준으로 회전값(Quaternion)을 생성합니다.
        Quaternion lookRotation = Quaternion.LookRotation(dir);

        // 3. 현재 회전값(transform.rotation)과 타겟을 바라보는 회전값(lookRotation) 사이를 보간(Lerp)하여 부드럽게 회전시킵니다.
        // Lerp는 선형 보간(Linear Interpolation) 함수로, 두 값을 시간에 따라 일정하게 섞어줍니다.
        // t 값이 0에 가까울수록 시작점(transform.rotation)에 가깝고, 1에 가까울수록 목표점(lookRotation)에 가까워집니다.
        Quaternion qRotation = Quaternion.Lerp(this.transform.rotation, lookRotation, turnSpeed * Time.deltaTime);

        // 4. 구한 회전값 qRotation에서 오일러 각도를 추출합니다. 오일러 각도는 Quaternion을 세 축의 각도로 변환한 값입니다.
        Vector3 eRotation = qRotation.eulerAngles;

        // 5. 오일러 각도 중 Y축 회전 값만을 사용하여 객체의 회전을 설정합니다.
        // Y축 값만 사용하는 이유는 객체가 타겟을 바라보되, X축이나 Z축으로의 회전은 제한하기 위해서입니다.
        transform.rotation = Quaternion.Euler(0f, eRotation.y, 0f);

        // 주석된 코드: 이 코드는 X, Y, Z 축 전체에 대해 보간된 회전값을 적용합니다.
        // transform.rotation = Quaternion.Lerp(this.transform.rotation, lookRotation, turnSpeed * Time.deltaTime);
    }
}

/*
Lerp(a, b, t) 함수 설명:
- Lerp 함수는 두 값(a와 b) 사이의 값을 보간합니다.
- t는 보간 계수로, 0에서 1 사이의 값을 가집니다.
  - t가 0이면 a 값과 동일한 값을 반환하고,
  - t가 1이면 b 값과 동일한 값을 반환합니다.
  - t가 0.5이면 a와 b의 중간 값을 반환합니다.

예제 1:
a=0, b=10인 경우,
t 값을 변경해가며 Lerp(a, b, t)를 호출하면 다음과 같은 결과를 얻을 수 있습니다.
- Lerp(0, 10, 0.1) // 1
- Lerp(0, 10, 0.2) // 2
- Lerp(0, 10, 0.3) // 3
...
- Lerp(0, 10, 0.8) // 8
- Lerp(0, 10, 0.9) // 9
- Lerp(0, 10, 1)   // 10

예제 2:
Lerp 결과를 a에 다시 할당하여 반복적으로 호출하면, 점점 a가 b에 가까워집니다.
a=0, b=10인 경우,
- a = Lerp(a, b, 0.1) // a=1
- a = Lerp(a, b, 0.1) // a=1.9 (처음 a가 1로 업데이트되었으므로, Lerp(1, 10, 0.1)이 실행됨)
- a = Lerp(a, b, 0.1) // a=2.71 (두 번째 a가 1.9로 업데이트되었으므로, Lerp(1.9, 10, 0.1)이 실행됨)
*/

+ Recent posts