정리하려다 본 글의 내용
유니티(C#)에서는 Vector3를 Update에서 계속 new로 생성해준다.
c++같은 경우에는 new로 생성한 객체나 구조체가 힙에 할당돼서 가비지로 남는다.
그러면 Update마다 Vector3를 new로 생성하는 것은 방에 쓰레기 쌓아놓는 것과 같은 미친 짓이 아닌가? 라는 생각이 든다.
하지만 C#에서는 구조체가 스택 영역에 들어가기 때문에 관리가 따로 필요 없는 자료형이다.
자세한건 C# 시리즈에 적어야겠다.
C#에서 클래스는 힙 영역에 할당 되고 구조체는 로컬 변수인 경우 스택에, 클래스의 멤버인 경우 클래스의 일부로 힙에 할당 된다.
public static Vector3 MoveTowards (Vector3 current, Vector3 target, float maxDistanceDelta);
현재 -> 목표 까지 maxDistanceDelta
만큼 움직인 위치를 반환해준다.
이 것을 오브젝트의 현재 위치로 대입해주면 이동이 구현된다.
매개변수로 현재 위치, 목표 위치, 거리 변위를 전달.
예시 코드
public float speed;
void Update()
{
//MoveTowards
transform.position =
Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
}
public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
현재 위치에서 목표 위치까지 벡터 값이 변경되는데 한 번에 변경되지 않고 일정한 부드럽게 변하게 한다. 그리고 그 벡터 값을 반환해준다.
예시 코드
transform.position = Vector3.Lerp(transform.position, target, Time.deltaTime);
public static Vector3 Slerp (Vector3 a, Vector3 b, float t);
출발 지점과 목표지점이 구체 평면 위에 있다고 가정하고 그 곡선 거리를 보간하여 순간의 벡터 값을 반환해준다.
출발과 목표간에 포물선같은 곡선이 생기고 그 위를 지난다고 보면 된다.
예시 코드
transform.position = Vector3.Slerp(transform.position, target, 0.1f * Time.deltaTime);
public static Vector3 SmoothDamp
(Vector3 current,
Vector3 target,
ref Vector3 currentVelocity,
float smoothTime,
float maxSpeed = Mathf.Infinity,
float deltaTime = Time.deltaTime);
목표 지점까지 부드럽게 이동할 때 순간의 위치를 반환해주는 함수이다.
currentVelocity
는
네 번째 매개변수는 목표지점까지 도달하는 시간이다.
레퍼런스
C# 구조체 메모리 영역 : https://kukuta.tistory.com/385 [HardCore in Programming:티스토리]
Lerp / 선형 보간 : https://iygames.tistory.com/6
Slerp / 구면 선형 보간 : https://gnaseel.tistory.com/14