유니티에는 오브젝트를 이동하기 위해서 여러 가지 방법을 사용할 수 있습니다.
1. transform.position
오브젝트의 위치를 강제적으로 바꿔서 오브젝트를 이동시키는 방법입니다.
오브젝트의 위치를 특정한 위치로 이동시키고 싶을 때는 아래와 같이 사용이 가능합니다.
public class test : MonoBehaviour
{
// 이동시키고자 하는 좌표를 지닌 Vector
Vector3 point = new Vector3(3f, 3f, 3f);
void Start()
{
Move();
}
void Move()
{
// point의 위치로 현재 오브젝트를 이동시킴
this.transform.position = point;
}
}
방향키를 입력받아서 오브젝트를 이동시키는 방법도 사용할 수 있습니다.
public class test : MonoBehaviour
{
// 오브젝트의 이동 속도
float speed = 5f;
void Update()
{
// 방향키의 입력 감지
float xInput = Input.GetAxisRaw("Horizontal");
float yInput = Input.GetAxisRaw("Vertical");
// 현재 Position에 Vector를 더해줌
this.transform.position += new Vector3(xInput * speed * Time.deltaTime, yInput * speed * Time.deltaTime, 0f);
}
}
방향키의 입력을 감지해서 xInput과 yInput에 값을 저장하고 speed만큼 오브젝트를 이동시키는 방법입니다.
2. Translate
이번에는 Translate라는 함수를 이용한 방법입니다.
Translate는 어느 좌표로 이동을 시키는 것이 아니라, 방향으로 이동시킬 수 있습니다.
public class test : MonoBehaviour
{
void Update()
{
// 오브젝트를 forward 방향(Z축)으로 이동시킴
this.transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
}
}
마지막 파라미터에 Space.World를 추가해주면추가해 주면 월드좌표계를 기준으로 움직이고, 생략하거나 Space.Self를 추가해 주면 로컬좌표계를 기준으로 움직입니다.
3. MoveToWards
MoveToWards 함수는 출발 지점에서 도착 지점으로 이동하게 하는 함수입니다.
public class test : MonoBehaviour
{
Vector3 target = new Vector3(5f, 0f, 5f);
float speed = 3f;
void Update()
{
this.transform.position = Vector3.MoveTowards(this.transform.position, target, speed * Time.deltaTime);
}
}
현재 위치에서 target의 위치로 speed만큼의 속도로 이동하게 됩니다.
MoveToWards 함수를 이용해서 자신을 쫓아오는 적을 구현할 수 도 있겠죠? 큐브가 자신을 따라오도록 만들어보겠습니다.
유니티 에디터에서 캡슐을 만들고 방향키로 움직이게하는 코드를 작성 후 컴포넌트로 부착합니다. 캡슐이 플레이어가 되는 것입니다.
그리고 큐브 오브젝트의 playerTransform 필드에 캡슐을 붙여 넣고 아래와 같이 코드를 작성합니다.
public class test : MonoBehaviour
{
// 추적할 대상의 Transform
public Transform playerTransform;
Vector3 target;
float speed = 2f;
void Update()
{
// 매 프레임마다 추적 대상의 위치를 target에 저장
target = new Vector3(playerTransform.position.x, playerTransform.position.y, playerTransform.position.z);
this.transform.position = Vector3.MoveTowards(this.transform.position, target, speed * Time.deltaTime);
}
}
4. SmoothDamp
SmoothDamp 함수는 이동하고자 하는 위치까지 부드럽게 이동을 시켜주는 함수입니다.
파라미터로 velocity와 smoothTime이 있는데 velocity는 현재 속도입니다. 부드러운 이동을 위해서 ref 키워드를 사용하여 함수 내부에서 velocity를 수정하여 사용합니다. smoothTime은 목표까지 도달하는데 소요될 시간입니다.
public class test : MonoBehaviour
{
// 목표 이동 위치
Vector3 target = new Vector3(5f, 0f, 5f);
// 이동 속도
Vector3 velocity = Vector3.zero;
// 이동에 소요될 시간
float smoothTime = 1f;
void Update()
{
this.transform.position = Vector3.SmoothDamp(this.transform.position, target, ref velocity, smoothTime);
}
}
이번에는 오브젝트를 추적하는 카메라에 적용해보도록 하겠습니다.
public class FollwingCamera : MonoBehaviour
{
public Transform playerTransform;
Vector3 velocity = Vector3.zero;
float smoothTime = 1f;
void Update()
{
Vector3 target = new Vector3(playerTransform.position.x, playerTransform.position.y, playerTransform.position.z);
this.transform.position = Vector3.SmoothDamp(this.transform.position, target, ref velocity, smoothTime);
}
}
playerTransform에 플레이어를 넣어주면 카메라와 플레이어가 겹쳐지게 되니 플레이어 하위에 카메라를 위치시킬 오브젝트를 하나 생성해 줍니다. 그리고 생성한 오브젝트를 playerTransform에 넣어줍니다.
public class Player : MonoBehaviour
{
float speed = 5f;
void Update()
{
float xInput = Input.GetAxisRaw("Horizontal");
float yInput = Input.GetAxisRaw("Vertical");
this.transform.position += new Vector3(xInput * speed * Time.deltaTime, yInput * speed * Time.deltaTime, 0f);
}
}
5. Lerp
Lerp는 선형보간법을 이용해서 값을 반환해 주는 함수입니다. 보통 SmoothDamp와 비슷하게 오브젝트를 부드럽게 이동하고자 할 때 자주 사용되는 함수입니다.
선형보간이란 시작 지점과 끝 지점이 주어졌을 때, 두 점 사이의 좌표를 구하는 것입니다.
시작 지점이 (0, 0, 0)이고 도착지점이 (0, 10, 10)이라면 두 점의 중간 지점은 어디일까요? (0, 5, 0)이 중간 지점이 됩니다.
시작 지점에서 도착지점까지 10% 거리에 위치한 지점은 어디일까요? (0, 1, 0)이 됩니다.
Lerp의 마지막 파라미터에는 0~1 사이의 값이 들어갑니다.
0.5를 넣어주면 시작 지점과 도착 지점의 중간 지점을 반환하고, 0.1을 넣어주면 10% 지점의 값을 반환하게 됩니다.
상수를 넣어주는 대신에 Time.deltaTime을 넣어서 speed를 곱해 사용할 수도 있습니다.
이러한 방식을 이용해서 오브젝트를 이동시킬 수 있습니다.
public class test : MonoBehaviour
{
Vector3 target = new Vector3(5f, 0f, 5f);
float speed = 3f;
void Update()
{
this.transform.position = Vector3.Lerp(this.transform.position, target, Time.deltaTime * speed);
}
}
유니티에서 사용되는 오브젝트 이동 방법은 사실 이 외에도 몇 가지가 더 있습니다.
포물선을 그리면서 이동하는 Slerp라는 함수도 있고, 리지드바디를 사용하여 물리법칙과 질량 등을 적용하여 오브젝트를 이동시킬 수도 있습니다.
각자 상황에 맞춰서 오브젝트 이동 방법을 골라서 사용하시면 될 것 같습니다 😊
'Engine > Unity' 카테고리의 다른 글
[Unity] 유니티 생명주기 (Life Cycle) (0) | 2024.05.20 |
---|---|
[Unity] TMP 사용방법 / 한글 폰트 깨질 때 (0) | 2024.05.06 |
[Unity] Ray / Raycast / RaycastHit (레이캐스트) (2) | 2024.03.26 |
[Unity] 싱글톤 패턴 (Singleton) (2) | 2024.03.20 |
[Unity] 스크립터블 오브젝트(Scriptable Object) (3) | 2024.03.18 |