Unity

Transform(2) - position

gcreators 2024. 9. 20. 18:00

지난 글에서 

세계 좌표계와 로컬 좌표계에 대해 설명했는데 한번 유니티에서 어떻게 차이가 나는지를 살펴본다.

 

public class test : MonoBehaviour
{
    private Transform tr = null;

    [SerializeField]
    private float moveSpeed = 10f;

    private void Awake()
    {
        tr = transform;
    }
}

다음과 같이 test.cs 에 tr 변수를 초기화 시켜 주고

 

private void Update()
{
    if (Input.GetKey(KeyCode.W))
    {

        tr.position = tr.position + (Vector3.forward * moveSpeed * Time.deltaTime); //W가 눌러졌을때 Z좌표 이동(앞으로 이동)
         
    }
    if (Input.GetKey(KeyCode.S))
    {
        tr.position = tr.position + -(Vector3.forward * moveSpeed * Time.deltaTime); //S가 눌러졌을때 Z좌표 이동(뒤로 이동)
    }//절대위치를 지정하는 것
}

transform 컴포넌트 내부에 position을 이런식으로 코드로 객체의 벡터를 조작해 위치를 이동시킬 수 있다.

 

기본상태
w,s를 눌러 z좌표 이동
실제 실행 장면

이렇게 z좌표값이 변경되며 이동됨을 알 수 있는데

여기서 Rotation(각도) 의 y값을 변경시킨 뒤

이 상태에서 이동을 시켜보면

이렇게 이동됨을 알 수 있다

객체가 바라보는 방향이 아닌

절대 좌표를 기준삼아 이동을 하기에 이렇게 되는 것이다

이를 객체가 바라보는 방향으로 이동하는 것이 로컬 좌표를 기준삼아 이동하는 것이 된다

 

로컬 좌표를 기준삼아 이동하기 위해서는 여러 방법이 있다

if (Input.GetKey(KeyCode.W))
{
    tr.position = tr.position + (tr.forward * moveSpeed * Time.deltaTime); 
}
if (Input.GetKey(KeyCode.S))
{
    //tr.position = tr.position + -(Vector3.forward * moveSpeed * Time.deltaTime);//Vector3기준
    tr.position = tr.position + (-tr.forward * moveSpeed * Time.deltaTime);//tr기준
}
if (Input.GetKey(KeyCode.A))
{  
    tr.Translate(Vector3.left * moveSpeed * Time.deltaTime);//A가 눌러졌을때 X값 이동(좌로 이동)
}
if (Input.GetKey(KeyCode.D)) 
{
    tr.Translate(Vector3.right * moveSpeed * Time.deltaTime);//D가 눌러졌을때 X값 이동(우로 이동)
}

기존에 사용한 Vector3은 절대좌표를 기준을 삼게 되고

tr은 선언해둔 객체를 기준으로 삼기 때문에 이 둘의 좌표계는 다르다.

 

그리고 Translate 라는 것을 활용 할 수 있는데

transform이라는 클래스 안에  translate라는 메서드가 있으며

객체의 현재 위치에 변화를 주는 방식으로 작동된다.

이는 상대위치, 지금 너의 위치에서 이만큼 변화한다 라는 의미를 가지고 있다고 이해하면 된다.

translate는 변환 행렬이 업데이트되어 객체의 새로운 위치가 렌더링 및 물리 계산에 반영된다.

변환 행렬은

position(위치) : 현재 위치에 이동 벡터가 더해져서 새로운 위치로 계산

rotation(회전) : 객체가 회전된 상태에 따라 이동 방향 변화

scale(크기) : 객체의 크기는 변하지 않지만, 변환 행렬에 포함

이를 포함하고 있다.

 

이를 통해 회전한 각도에 맞게 이동이 이루어지는데

이렇게 w,s를 통해 앞 뒤로 움직이지만 회전한 객체를 기준 (변화한 y축) 으로 움직이기에 x,z값이 모두 바뀜을 확인 할 수 있다.

'Unity' 카테고리의 다른 글

Prefab  (0) 2024.09.24
Collision(충돌)  (0) 2024.09.23
Transform(1) - 좌표  (0) 2024.09.20
충돌 처리(1) - AABB  (0) 2024.09.19
Inspector  (0) 2024.09.12