게임심화 - 5. Script - 평행이동

LSDrug·2024년 7월 1일

1. 좌표

Global : 실제 3차원 좌표계가 있다고 하면, 전체 world 좌표를 기준으로 떨어진 좌표
Local : 상대좌표. 특정 좌표 밑에 child로 붙는 좌표

예를 들어서 전체 world에서 3차원 사각형이 있다고 하자. 이 좌표는 (4,2,2)이다.
이때, 전체 world의 원점을 기준으로 떨어진 좌표가 (4,2,2)이므로 이 사각형은 Global 좌표이고 좌표값의 크기는 (4,2,2)다.

만약, 3차원 사각형에 child로 붙어있는 원기둥 오브젝트가 있다면, 이 오브젝트는 (0,0,0)의 Local 좌표를 가지고, (4,2,2)의 Global 좌표를 가지게 된다.

그리고 원기둥 오브젝트를 x방향으로 1 이동시키면, 각 좌표의 변화는 다음과 같다.

따라서, 다음과 같은 공식이 성립한다.

부모좌표 + 자식의 로컬좌표 = 자식의 글로벌 좌표

이는 scale(크기 조절)과 Rotation(회전 조절)에도 마찬가지로 적용된다. 따라서, 부모가 크기를 조절하거나 회전을 준다면 자식도 크기와 회전이 변화한다.

2. 실전 예시

예를 들어서, 유니티 프로그램에서 정사면체 모양의 Cube를 만들고 3차원 원 모양의 Sphere를 만들어보자.

Cube의 Position은 (4,1,4) 이고 Sphere의 Position은 (0,0,0)이다.
이때, Sphere의 오브젝트를 Cube의 Child로 만들어주면, Position은 (-4,-1,-4)가 된다.

이는 Cube Position + Sphere local Position = Sphere Global Position이기 때문이다.

또한 부모가 이동하게 되면 자식도 같이 이동하는 것을 볼 수 있다. Cube를 x 방향으로 1 이동하고 Sphere가 Child를 취소하면 x 방향으로 1 이동하는 것을 볼 수 있다.

3. 오브젝트 이동

오브젝트 이동은 다음을 이용할 수 있다.

  • 절대 좌표를 이용하는 방법
public class Mover : Monobehaviour
{
	void Start()
    {
    	Vector3 targetPosition = new Vector3(1,0,0); // 절대 좌표
        transform.position = targetPosition; // 이동
    }
}
  • 벡터를 이용하는 방법
public class Mover : Monobehaviour
{
	public Vector3 move = new Vector3(-5,-5,-5); // 벡터, 상대 좌표
	void Start()
    {
    	transform.position += move;
    }
}
  • Translate를 활용하는 방법
public class Mover : Monobehaviour
{
	public Vector3 move = new Vector3(-5,-5,-5); // 벡터, 상대 좌표
	void Start()
    {
    	transform.Translate(move);
    }
}

4. DeltaTime, FixedDeltaTime, TimeScale

오브젝트의 움직임을 자연스럽게 하기 위해서 사용한다.

  • DeltaTime : 마지막 프레임이 완료되기까지 걸리는 시간

  • FixedDeltaTime : DeltaTime이 컴퓨터의 성능에 따라 프레임의 효율이 달라지기 때문에 시간을 고정시켜서 프레임의 효율을 고정시켜 준 것.
    컴퓨터의 성능에 따른 게임의 변화를 막기 위해서 FixedDeltaTime과 FixedUpdate를 섞어 사용한다.

  • TimeScale : 게임 전체의 UpdateTime을 조정하고 싶을 때 사용 (리플레이, 4배속, 2배속..)

다음 이미지처럼 사용한다.

변수로 속도를 추가하여 이동 속도까지 적용시킬 수 있다.


profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글