Transform과 오브젝트 움직임

대인공·2022년 10월 14일
1

Unity

목록 보기
6/14
post-thumbnail

Transform

유니티 에디터에서 어떠한 오브젝트를 생성하여도 기본으로 붙어있는 Compomemt이다.
기본적으로는 전역좌표계를 기준으로 해당 오브젝트의 Position, Rotation, Scale이 표시된다.


전역 좌표계, 지역 좌표계

스크립트 상에서 상속의 관계가 있듯이, 유니티 에디터 상에도 오브젝트 간에 그런 유사한 관계가 있다.


  • 전역 좌표계
    - 월드 공간상의 어느 중점 (0, 0, 0) 또는 (0, 0)을 기준으로 자신의 Position, Rotation, Scale을 측정한다.

  • 지역 좌표계

    - 위의 사진처럼 상위 오브젝트를 기준으로 하위 오브젝트는 자신의 Position, Rotation, Scale을 측정한다.

참조 : https://docs.unity3d.com/kr/2018.4/Manual/Transforms.html



오브젝트 움직임

유니티 에디터 상에서 오브젝트의 움직임을 제어할 수 있는 Component는 Transform과 RigidBody가 있다.


Transform과 RigidBody의 차이점

이 두가지의 차이점으로는 물리엔진의 사용 유무에 있다.

  • Transform
    - 물리엔진을 사용하지 않는다.
    - 오브젝트의 Vector를 변화하여 움직임을 제어한다.

  • RigidBody
    - 물리엔진을 사용한다.
    - 오브젝트에 Force를 가하여 움직임을 제어한다.
    - 오브젝트의 Velocity를 변경하여 움직임을 제어한다.

단순히 생각하면
Transform을 사용할 경우에는 오브젝트를 현재 위치에서 다음 위치로 순간이동 시키는 것이고
RigidBody을 사용할 경우에는 오브젝트에 Force를 가해 현실의 움직임처럼 다음위치로 이동시키는 것이다.


Transform을 사용한 움직임

Transform을 사용하면 위에서 말했듯이 오브젝트를 매 프레임 순간이동 시키는 것이다.

예를 들면 다음과 같은 이동함수를 Update()에서 실행하였을 경우,

transform.Translate(Vector3)

해당 스크립트가 붙어있는 GameObject는 전달된 인자만큼 매 프레임 자신의 좌표에서 인자값만큼 더한 값의 좌표로 순간이동 하게되는 것이다.


RigidBody를 사용한 움직임

RigidBody는 Force를 사용하여 움직임을 제어하는 것과,
Velocity라는 속도를 사용하여 움직임을 제어하는 것이 있다.

각각 다른 움직임을 보인다.


1. Force를 사용한 움직임 제어

Force를 사용한 움직임은 간단히 말해 오브젝트가 움직이고 싶은 방향으로 오브젝트에 일정한 Force를 가하는 것이다.

이러한 Force를 가지고 움직임을 제어하는 것은 현실과 유사하게 생각하면 쉬운데, 어느 한 물체에게 일정한 힘을 계속 가하면 그 물체의 속력이 점점 증가하게 된다. 속력이 너무 빠르면 멈추거나 방향을 전환하려할 때에는 관성이 적용되어 쉽게 변경하기 어렵게 된다.

Force를 사용할 때는 미는 힘을 직접 선언해주어야 한다.

Rigidbody.AddForce(Vector3 * force);

예를 들면

Rigidbody.AddForce(Vector3.forward * force);

를 가지고 FixedUpdate() 상에서 구현하면 오브젝트는 Vector3.forward방향으로 force만큼 계속 가하게 된다.


외부 입력을 받아오는 GetAxis나 GetAxisRaw를 사용하여 아래와 같이 적용해도 된다.

float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Virtical");

Vector3 moveDir = new Vector3(h, 0, v);

Rigidbody.AddForce(moveDir * force);


2. Velocity를 사용한 움직임 제어

속도는 속력에 위치값을 갖는것인데, 오브젝트의 속도를 바꿔 오브젝트의 움직임을 제어하는 것이다.

Velocity를 사용할 때는 속력을 직접 선언해주어야 한다.

Rigidbody.velocity = Vector3 * movespeed;

예를 들면

Rigidbody.velocity = Vector3.forward * movespeed;

를 FixedUpdate() 상에서 구현하면 오브젝트는 Vector3.forward방향으로 10의 속력을 가지고 일정한 속도로 이동하게 된다.


외부 입력을 받아오는 GetAxis나 GetAxisRaw를 사용하여 아래와 같이 적용해도 된다.

float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Virtical");

Vector3 moveDir = new Vector3(h, 0, v);

Rigidbody.velocity = moveDir * movespeed;


주의점

하나의 오브젝트에서 두가지 방법 모두를 사용하여 움직임을 제어하는 것은 연산의 오류를 불러오게된다. 반드시 하나의 방법만을 사용하여 움직임을 제어하여야 한다.

profile
이제 막 시작하는 유니티 클라이언트

1개의 댓글

comment-user-thumbnail
2023년 9월 5일

글 도움이 많이 되었습니다!

답글 달기