[ 목표 지점으로 이동하기 ] & [ 이동 함수 ]
Vector3 클래스에서 제공하는 이동 함수
MoveTowards / SmoothDamp / Lerp / Slerp
> position 과 Translate 비교 !
- transform.position
Wolrd 좌표 값 , 월드 좌표를 기준으로 물체를 이동
Vector에 해당하는 좌표로 이동
- transform.Translate
Local 좌표 값 , 물체를 기준으로 물체를 이동
Vector값을 현재 위치에 더하는 함수 = 해당 오브젝트를 Vector3에 넣은 좌표값 만큼 이동
1. MoveTowards ( 단순 등속 이동 )
- 기본 형식
Vector3.MoveTowards(현재위치, 목표위치, 속도);
MoveTowards의 매개변수는 (현재위치, 목표위치, 속도)로 구성됩니다
- 예제
public class Move : MonoBehaviour
{
Vector3 target = new Vector3(8, 1.5f, 0);
void Update()
{
transform.position = Vector3.MoveTowards(transform.postion, target, 2f);
}
}
오브젝트가 (8, 1.5f, 0) 좌표로 2f 속도로 단순 등속 이동하는 로직입니다
.
.
.
.
결과
2. SmoothDamp (부드러운 감속 이동 / 미끄러지듯이 감속 이동)
- 기본 형식
Vector3.SmoothDamp(현재위치, 목표위치, 참조속도, 속도);
SmoothDamp 매개변수는 (현재위치, 목표위치, 참조속도, 속도)로 구성됩니다
마지막 매개변수에 반비례하여 속도가 증가하며, 일자로 가다가 부드럽게 도달합니다
- 예제
Vector3 target = new Vector3(8, 1.5f, 0);
void Update()
{
Vector3 velo = Vector3.zero;
transform.position = Vector3.SmoothDamp(transform.position, target, ref velo, 0.1f);
}
Vector3.zero는 좌표값이 (0, 0, 0)임을 의미합니다
매개변수 참조속도에 위치한 ref 는 '참조 접근'으로, 실시간으로 바뀌는 값을 적용할 수 있습니다 (아직 어려운 이론)
*속도 값이 작을 수록 빠르게 이동합니다
.
.
.
.
.
오브젝트가 (8, 1.5f, 0)으로 0.1f 속도로 이동하는 로직입니다
3. Lerp (선형 보간)
SmoothDamp 보다 감속시간이 깁니다
- 기본 형식
Vector3.Lerp(현재위치, 목표위치, 속도);
- 예제
void Update()
{
transform.position = Vector3.Lerp(transform.position, target, 0.05f);
}
속도에 해당하는 마지막 매개변수에 비례하여 속도가 증가합니다 (최대값 1)
* 마지막 매개변수가 작을 수록 느리게 이동합니다
.
.
.
.
.
4. Slerp (구면 선형 보간)
Lerp과 다른 점은 '호를 그리며 이동'한다는 것입니다
- 기본형식
Vecotr3.Slerp(현재위치, 목표위치, 속도);
- 예제
void Update()
{
transform.position = Vector3.Slerp(transform.position, target, 0.05f);
}
호선을 그리며 이동합니다
.
.
.
.
.
[ 델타 타임 ]
이동거리를 공평하게 하기 위한 함수
기기의 성능에 따라 프레임 속도가 다를수 있는데, 이를 완화하여 똑같은 속도를 내는 함수입니다
*끊김 방지 !!
Time.deltaTime : 이전 프레임의 완료까지 걸린 시간
deltaTime : 값은 프레임이 적으면 크고, 프레임이 많으면 작음
[ Time.deltaTime 사용하는 방법 ]
Translate : Vector 에 곱하기
transform.Translate(vec * Time.deltaTime);
Vector 함수 : 시간 매개변수 곱하기
Vector3.Lerp(Vec1, Vec2, T * Time.deltaTime);
예제
void Update()
{
Vector3 vec = new Vector3(Input.GetAxisRaw("Horizontal") * Time.deltaTime,
Input.GetAxisRaw("Vertical")*Time.deltaTime, 0);
transform.Translate(vec);
}
'유니티' 카테고리의 다른 글
유니티 물체 이동하기 AddForce / ForceMode / AddTorque (0) | 2022.04.11 |
---|---|
유니티 오브젝트 중력과 충돌 / Material / Collider / RigidBody 기초 (0) | 2022.04.11 |
유니티 오브젝트 움직이기 - Input / GetKey / GetButton / Vector3 / GetAxis (0) | 2022.04.09 |
유니티 이벤트 함수의 실행 순서 (0) | 2022.04.06 |
유니티 C# 프로그래밍 기초 - 클래스 생성 및 상속 (0) | 2022.04.05 |