Unity Transform, Rotation

장현태입니다·2025년 4월 16일

Transform

유니티에서 모든 객체가 가지는 컴퍼넌트로 위치 크기 회전의 값을 가지고있는 컴퍼넌트이다.

transform을 이용한 이동방법

transform을 이용해 움직이는 방법 이전에 주의사항이 있는데 바로 프레임이다 update가 프레임마다 실행되기 떄문에 같은 시간이라도 이동한 거리가 달라지게된다.
1초동안 동일한 거리를 조절해주는 Time.deltaTime사용
-> 1초동안, 프레임, x씩 움직임
-> 1초동안, 프레임, 1/100번 움직임 <-> 1/10번 움직임

1/x초동안 1번 움직임 = 1프레임당 걸린시간 = deltaTime

Position

Position을 변경하는 경우 다음과같은 형식으로 이용 가능한데 목표지점까지 움직이는 MoveTowards와 Lerp와 매개변수의 특성에 따라 local, world기준으로 사용 가능한 Translate를 알아보겠다. 먼저 Translate의 경우

global 기준으로 오브젝트의 position을 설정하고 싶으면 Space.World,
Local 기준으로 오브젝트의 position을 설정하고 싶으면 Space.Self를 사용하면 된다.

MoveTowards의 경우 현재 오브젝트 위치와 타겟의 위치 그리고 속도를 매개변수에 넣어주면 일정한 속도로 목표지점까지 움직이게한다.

Lerp의 경우는 조금 특이하게 동작하는데 목표지점과 현재 지점의 중간지점까지 움직이고 중간지점부터 목표지점의 중간지점, 또 그 중간지점까지 가는 보간을 이용한다. 그렇기 떄문에 시작할 때의 속도는 높고 목표지점과 가까워질수록 속도가 줄어드는 현상을 볼 수 있다.

Rotation
3개의 원소만 사용하여 표현하게 된다면 짐벌락현상이 일어나기 떄문에
유니티에선 rotation을 Quaternion을 사용해 표현한다.

회전을 직접 지정해주는 방법으로 transform.rotation 현재 회전정보에 Quaternion.Euler() 오일러각을 넣는 방법이다 그리고 벡터를 Quaternion으로 변환하는 방법 그 반대 방법도 있다.

transform.Rotate(Vector3.up, rotateSpeed);
에서 Vector3.up을 작성한 이유는 Rotate는 축을 기준으로 회전을 시키므로 y축에 해당하는 Vector3.up을 작성해주었다 이렇게 실행할경우 오브젝트는 좌우의 방향으로 입력에따라 회전하게된다.

플레이어 움직임 만들기

Input System

//GetAxis GetAxisRaw - Input Manager
GetAxis - 점점 -1 ~ 0 ~ +1
GetAxisRaw 바로 -1 or +1

getAxis의 경우 유니티의 Input System에 들어가게되면 Axis에서 확인가능한데
대표적인 예시로 Horizontal, Vertical이 있다.
이 둘은 float형식으로 값을 입력에따라 -1 ~ 1의 값을 출력시켜준다 이 때
GetAxis의 경우 값에 다가가는 형식으로 가속도처럼 값이 천천히 올라가고
GetAxisRaw의 경우 값에 바로 다다가는 형식이다.

실습예제

위의 회전과 움직임으로 객체 만들기
탱크를 구현하는데 위의 폭탄과 밑의 움직임을 달리해줘서 구현

앞뒤의 구현과 키를 입력할떄마다 회전각도를 설정하는데 이 때 회전 각이 한번에 90도 씩 변경하면서 이미 오른쪽일경우 다른각으로 변경되지 않도록 오일러각을 transform.rotation에 입력해주었다. 그리고 위의 따로 움직여야하는 부분은 Horizontal을 사용하여 A,D키를 입력시 회전만 진행하도록 따로 오브젝트에 스크립트를 넣어주었다.

0개의 댓글