*** 공부하다 알게 된 것들을 메모하는 페이지입니다. 오류가 있을 수 있습니다. ***
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowingCam : MonoBehaviour
{
public GameObject target;
public Transform targetTransform; //추적 대상의 Transform
private float _distance; //Camera와 target 사이의 거리
private float _cameraHeight; //Camera 높이
private float _smoothRate; //부드러운 Camera 회전
private Transform _cameraTransform; //Camera의 tranform
private Vector3 _targetPosition;
// Start is called before the first frame update
void Start()
{
Distance = 10.0f;
CameraHeight = 30.0f;
SmoothRate = 5.0f;
CameraTransform = gameObject.GetComponent<Transform>();
target = GameObject.FindGameObjectWithTag("rider");
targetTransform = target.GetComponent<Transform>();
}
// Update is called once per frame
void LateUpdate()
{
float currYAngle = Mathf.LerpAngle(CameraTransform.eulerAngles.y, targetTransform.eulerAngles.y, SmoothRate*Time.deltaTime);
Quaternion rot = Quaternion.Euler(0, currYAngle, 0);
CameraTransform.position = targetTransform.position - (rot*Vector3.forward*Distance)+(Vector3.up*CameraHeight);
CameraTransform.LookAt(targetTransform);
}
}
인터넷에 있는 자료들과 책에 있는 자료를 통해서 재구성해 봤다. 프로퍼티를 사용한 부분이 있는데 현재로서의 나는 일단 웬만한 private 변수들은 무조건 getter setter를 미리 만들어 놓으려고 해서 생긴 일이고 여기 올릴 때 굳이 필요없는 getter, setter 부분은 쳐냈다.
기본적으로는 1. 카메라가 쫓아갈 target을 기준으로 2. 카메라의 위치를 원하는 만큼 거리를 두고(_distance, _cameraHeight) 계속 조절한다(LateUpdate). 이것을 구현하기 위한 부분은 패싱하고, 생소한 부분들에 대해 메모해 둔다.
1. LerpAngle
public static float LerpAngle(float a, float b, float t);
t 시간 동안 a 부터 b 까지 변경되는 각도를 반환한다. float t 값을 조절하여 회전 감도를 조절할 수 있다.
... 솔직히 잘 와닿지가 않는데 '선형보간법' 이라는 게 있다고 한다. 그게 Lerp 함수이고 이 LerpAngle 함수가 그것의 각도 버전... 따라서 a,b(from, to) 값이 360.0f 를 벗어나면 안 된다고 한다.
여기서는 a각에서 b각으로, t 민감도에 따라 이동한다고 생각하면 될 것 같다.
2. eulerAngles
'오일러각' 이라는 개념이 있다(고 한다). 우리에게 익숙한 x,y,z축 0~360도 좌표계가 Euler Angle이다. 다만 Euler Angle은 Gimbal lock 이라는 문제점이 있다고 한다. 축이 겹쳐서 특정 방향으로 회전이 안 되는 문제라는데.. 아무튼 그런 문제가 있다고 치자. 그래서 유니티는 내부적으로 Quaternion 좌표계를 사용한다.
따라서, 우리가 Quaternion.Euler를 통해서 Euler Angle을 Quaternion으로 다시 바꾸어 준 것으로 이해했다.
즉, 내가 이해하기로는
1. Camera와 Target 간의 Euler Angle 차이를 구함.(currYAngle). 이때 화면 회전을 부드럽게 하기 위해 float t 자리에 들어간 것이 smoothRate.
2. 그 값을 Quaternion 값으로 변환함. Unity에서 내부적으로 Quaternion 좌표계를 쓰기 때문.
3. Target의 위치에서 2. 에서 구한 Quaternion 값을 통해 원하는 만큼(distance, height를 이용해) 카메라 위치를 조절함.
4. LateUpdate를 통해, 이것을 계속 반복함.
이 정도 되는 것 같다.
일단은 이렇게 정리해 두고 더 깊은 이해가 필요한 날이 있으면 이 아래 추가하기로 한다.
'게임개발' 카테고리의 다른 글
[Unity] Transform.SetParent (0) | 2023.01.19 |
---|---|
[Unity] UI_Canvas (0) | 2023.01.03 |
[Unity] Physics.Raycast (0) | 2023.01.01 |
[Unity] Collider (0) | 2023.01.01 |
[문제] Transparency Sort Axis가 Play mode 실행 시 원래대로 돌아가는 문제 (0) | 2022.09.15 |