현재 위치에서 목표 위치로 이동시키기
Unity에서는 키보드나 마우스 입력으로 이동하는 방법 외에도 지정된 지점으로 이동하게 해주는 방법들을 제공해 준다. 그 방법들에 대해서 하나씩 알아보자. 실제로 내가 만들어서 구글 스토어에 올린 배리어 라우트라는 게임은 처음부터 끝까지 오늘 알아볼 방법들을 이용하여 움직인다.
자 그럼 본격적으로 알아보기 전에 유니티 에디터를 켜고 사전 세팅을 먼저 해보자.
하이어라키 창에서 아래와 같이 이동에 필요한 오브젝트들을 생성하자.
1. 3D Object → Plane 생성 후 Transform을 아래와 같이 입력한다.
2. 3D Object → Capsule 생성 후 Transform을 아래와 같이 입력한다.
3. Create Empty 생성 후 이름을 'TargetPosition'으로 변경 후 Tranform을 아래와 같이 입력한다.
4. TargetPosition 아래 자식 오브젝트로 큐브를 생성한다. 3번에서 생성한 TargetPosition에 마우스를 가져가서 우클릭 → 3D Object → Cube 생성 후 Transform을 아래와 같이 입력한다.
5. 파란색과 빨간색 Material 생성 후 각각 Capsule과 Cube에 드래그하여 넣는다.
위의 작업을 완료하면 아래와 같은 세팅이 될 것이다. 그럼 이제 본격적으로 이동하는 방법에 대해서 알아보자.
■ 일정한 속도로 목표지점으로 이동(MoveToward)
Vector3의 function 중 MoveToward라는 함수는 일정한 속도로 목표지점까지 이동하도록 명령한다.
프로젝트 창에 C# 스크립트를 하나 생성하고 이름을 'MoveToTarget'으로 만들자. 그리고 C# 스크립트를 캡슐 안에 드래그하여 넣는다. C# 스크립트를 열어서 아래와 같이 입력해 보자.
using UnityEngine;
public class MoveToTarget : MonoBehaviour
{
public GameObject targetPosition;
void Update()
{
transform.position = Vector3.MoveTowards(gameObject.transform.position, targetPosition.transform.position, 0.1f);
}
}
|
cs |
코드를 살펴보면 우리가 목표지점의 Transform.Position 정보를 가져올 GameObject 변수를 public으로 선언했다. 그리고 Update 메서드에 목표지점까지 등속으로 이동하도록 코드를 작성하였다.
Vector3.MoveToward(시작 지점, 목표지점, 이동속도)
이동속도는 입력하는 숫자에 비례하여 증가하거나 감소한다.
유니티 에디터 창에 돌아와 캡슐을 클릭해보면 우리가 드래그하여 넣은 C# 스크립트에 TargetPosition GameObject를 넣으라고 나올 것이다. TargetPosition(C# 스크립트)에 TargetPsotion(Create Empty)를 드래그하여 넣자.
이제 유니티를 실행시켜보자. 아래와 같이 등속으로 움직이는 캡슐을 볼 수 있다.
■ 목표지점 근처에서 감속하며 이동(SmoothDamp)
목표지점까지 이동하는 방법 중 목표지점 근처에서 감속하여 도달하는 SmoothDamp에 대해서 알아보자.
C# 스크립트를 아래와 같이 수정하고 저장하자.
using UnityEngine;
public class MoveToTarget : MonoBehaviour
{
public GameObject targetPosition;
Vector3 vel = Vector3.zero;
void Update()
{
transform.position = Vector3.SmoothDamp(gameObject.transform.position, targetPosition.transform.position, ref vel, 1f);
}
}
|
cs |
Vector3.SmoothDamp(시작 위치, 목표 위치, 참조 속도, 스무스 타임)
여기 참조 속도라는 것이 들어가 있는데, 이것은 솔직히 정확히 어떤 원리로 되는 것인지 모르겠다. 현재 변화량을 기록해 넣을 수 있는 값을 변화량(속도)을 저장하는 변수라고 한다. 이 내용에 대해 아시는 고수분들이 이 글을 보시게 된다면 한 수 가르쳐 주십시오.
MoveToward와 다른 또 한 가지는 바로 마지막 변수로 들어가는 숫자(스무스 타임). MoveToward는 오브젝트가 이동하는 속도를 입력했다. 하지만 SmoothDamp는 목표지점을 도달하기 위한 시간이 들어간다. 그래서 작은 값이 들어갈수록 이동속도가 빨라진다.
위에서 보는 바와 같이 목표지점에 가까워질수록 속도가 감소하는 것을 볼 수 있다. 마치 자동차가 서서히 브레이크를 밟는 그런 느낌이다.
■ 선형 보간을 이용한 목표지점 이동(Lerp)
용어부터 어려워서 하기 싫어질지 모르지만, SmoothDamp와 비슷한 효과가 나오며 사용법은 오히려 SmoothDamp보다 간단하다. 아래와 같이 C# 스크립트를 수정해보자.
using UnityEngine;
public class MoveToTarget : MonoBehaviour
{
public GameObject targetPosition;
void Update()
{
transform.position = Vector3.Lerp(gameObject.transform.position, targetPosition.transform.position, 0.05f);
}
}
|
cs |
Vector3.Lerp(시작 위치, 목표 위치, 0~1 사이의 숫자)
0~1 사이의 숫자는 목표 위치의 가중치를 나타내는 것으로
0을 입력하면 움직이지 않으며, 1을 넣으면 빛의 속도로 목표지점까지 도달하게 됩니다.
즉, 1에 가까울수록 빠른 속도로 이동하게 됩니다.
유니티 에디터로 돌아와 실행시켜보면 아래와 같이 진행됨을 볼 수 있습니다.
■ 구형 보간을 이용한 이동(Slerp)
마지막으로 이 이동 방법은 위로 호를 그리면서 이동한다. 마지막이니 빠르게 수정해보자. C# 스크립트에 S 하나 추가해주면 된다.
using UnityEngine;
public class MoveToTarget : MonoBehaviour
{
public GameObject targetPosition;
void Update()
{
transform.position = Vector3.Slerp(gameObject.transform.position, targetPosition.transform.position, 0.05f);
}
}
|
cs |
함수의 구성은 Lerp와 동일하게 참조하면 된다.
바로 유니티 에디터를 실행하여 어떻게 움직이는지 확인해 보자.
위의 그림과 같이 크게 호를 그리며 이동하며, 목표지점에 가까울수록 속력이 감소한다. 마치 우주선 착륙하는 느낌이 난다.
이렇게 한 지점에서 다른 지점까지 이동하는 방법에 대해서 알아보았다.
여러 가지로 유용한 방법들이니 참조하시고, 도움이 되었으면 좋겠다.
'유니티' 카테고리의 다른 글
[Unity] Rigidbody 를 이용한 이동(AddForce, Velocity, GetAxis) (1) | 2020.06.11 |
---|---|
[Unity] 입력값으로 오브젝트의 이동 방법(Transform.position, Translate) (0) | 2020.06.10 |
[Unity] 2D Project 에서도 3D Object Color 변경 가능할까? (0) | 2020.06.09 |
[Unity] 3D 오브젝트 Color 변경 (1) | 2020.06.08 |
유니티 공부를 시작하게 된 이유... (0) | 2020.06.04 |