하이하이
와타시 기계과 감성쟁이!
Today we're gonna learn about how to move the object!
와!!
1. MoveTowards (현재 위치, 목표 위치, 속력)
transform.postion() 은 오브젝트의 위치를 결정하는 함수입니다.
Vector3.MoveTowards(현재 위치, 목표 위치, 속력) 은 해당 값들을 매개변수로 사용합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour
{
Vector3 destination = new Vector3 (3, 4, 5);
void Update()
{
transform.position =
Vector3.MoveTowards(transform.position, destination, 1);
}
}
gif를 만들기도 그렇고, 녹화를 하기도 그렇고 참 애매하네요.
어쨋거나 움직입니다.
근데 좀 끊기는 느낌이 있어요.
잠시만, 근데 왜 현재위치에 transform.postion이 들어갈까요?
궁금해진 감성쟁이는 실험을 해봅니다.
가설은
'현재위치에서 목표위치 방향으로 속력만큼 움직인다' 였습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour
{
Vector3 start = new Vector3(0, 0, 0);
Vector3 destination = new Vector3 (3, 3, 3);
void Update()
{
transform.position =
Vector3.MoveTowards(start , destination, 1);
}
}
Position 성분 하나를 제곱하고, 3을 곱한 뒤 루트를 씌워주니까 1이 나왔습니다.
제 생각이 맞았군요.
그리고 (3,3,3)에 도달하지 못하는 이유는
초기 위치가 (0,0,0)으로 계속 초기화 되기 때문입니다.
2. SmoothDamp (현재 위치, 목표 위치, 참조 속력, 소요 시간)
SmoothDamp (현재위치, 목표위치, 참조 속력, 소요 시간) 은 해당 값들을 매개변수로 사용합니다.
목표위치에 부드럽게 도착합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour
{
Vector3 destination = new Vector3 (3, 3, 3);
void Update()
{
/*
transform.position =
Vector3.MoveTowards(start , destination, 1);
*/
Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
transform.position = Vector3.SmoothDamp(transform.position, destination, ref speed, 0.1f);
}
}
"아니 0.1초 만에 가야하는거 아님?????????"
이라고 하시겠지만...
부동소수점에 의한 컴퓨터의 태생적 실수 연산 문제이므로,,,
넘어가줍시다,,,
에 의하면,,, 이로 인해 생길 수 있는 문제들을 해결하는 방법들도 있으니 참고하세요,,,
선생님 그러면 참조속도는 뭐에요??
ref 와 참조에 대한 글이다.
어떤 메소드에서 어떤 값이 변경되었을 때,
다른 메소드에서 그 변경된 값을 호출하고 싶으면 ref를 사용한다는 말.
단순하게 이해하자면, smooth 한 움직임을 위해서는 곡선형태의 그래프가 그려져야하고
이를 위해선 이전 값을 알아야하므로, 그 이전 값을 참조 속도(위에서는 ref speed)에 저장하여 이용하는 것입니다.
정확한 원리에 대해서는 모르겠어요!! 당당당당 숭구리당당
위 코드에서 (0,0,0)을 Vecor3.zero 로 표현했는데,
zero 부분은 캡쳐 속 키워드들로도 변경 가능합니다.
3. Lerp (현재 위치, 목표 위치, 보간 간격)
Lerp (현재 위치, 목표 위치, 보간 후 위치) 는 선형보간을 이용한 이동 함수입니다.
선형보간은 영어로 Linear interpolation 이라고 하는 수치해석의 한 방법인데,
위 그래프처럼 임의의 두 점을 대상으로 Linear interpolation을 취하면
이걸 이해한다면
저 Returns 값을 이해하실 수 있을 겁니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour
{
Vector3 destination = new Vector3(3, 3, 3);
void Update()
{
/*
transform.position =
Vector3.MoveTowards(start , destination, 1);
*/
Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
transform.position = Vector3.Lerp(transform.position, destination, 0.001f);
}
}
t 가 작을수록, 간격이 작아지므로 속도가 느려집니다.
물론 그만큼 부드러운 움직임을 보여줘요.
4. Slerp (현재 위치, 목표 위치, 보간 간격)
Slerp (현재 위치, 목표 위치, 보간 간격) 은 구면 보간을 이용합니다.
따라서, 움직임도 호을 따라가요!
매개변수에 대한 개념은 선형보간과 같습니다.
다만, 선형이 아니라 구의 겉면을 따라 간다는 점이 다릅니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour
{
Vector3 destination = new Vector3(-5, -3, 0);
void Update()
{
/*
transform.position =
Vector3.MoveTowards(start , destination, 1);
*/
/*
Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
transform.position = Vector3.Lerp(transform.position, destination, 0.001f);
*/
transform.position = Vector3.Slerp(transform.position, destination, 0.01f);
}
}
Slerp 는 내부 계산에 따라 매번 궤적이 달라진다고 합니다.
그래서인지 저는 선형으로 가네요 ㅠㅠ
오늘은 여기까지
그럼 안녕
(김계란 아저씨 톤)