강의, 책/[Unity] C#과 유니티로 만드는 MMORPG 게임 개발 시리즈

Section 2. Transform - Position(WASD로 플레이어 움직이기)

hye3193 2024. 1. 16. 16:03
void Update()
{
    if (Input.GetKey(KeyCode.W))
        transform.position += Vector3.forward * Time.deltaTime * _speed;
    if (Input.GetKey(KeyCode.S))
        transform.position += Vector3.back * Time.deltaTime * _speed;
    if (Input.GetKey(KeyCode.A))
        transform.position += Vector3.left * Time.deltaTime * _speed;
    if (Input.GetKey(KeyCode.D))
        transform.position += Vector3.right * Time.deltaTime * _speed;
}

요약: WASD 키로 캐릭터가 움직이도록 만드는 코드

단, 위와 같이 코드를 작성할 경우 position이 월드 좌표 기준이기 때문에 캐릭터의 rotate가 변경되면 어색하게 움직이게 된다

 

따라서 아래와 같은 함수들을 사용해야 한다

 

Local 좌표를 World 좌표로 변환

transform.TransformDirection()

 

World 좌표를 Local 좌표로 변환

transform.InverseTransformDirection()

 

void Update()
{
    if (Input.GetKey(KeyCode.W))
        transform.position += transform.TransformDirection(Vector3.forward * Time.deltaTime * _speed);
    if (Input.GetKey(KeyCode.S))
        transform.position += transform.TransformDirection(Vector3.back * Time.deltaTime * _speed);
    if (Input.GetKey(KeyCode.A))
        transform.position += transform.TransformDirection(Vector3.left * Time.deltaTime * _speed);
    if (Input.GetKey(KeyCode.D))
        transform.position += transform.TransformDirection(Vector3.right * Time.deltaTime * _speed);
}

따라서 캐릭터 상 forward, back, left, right 방향의 벡터를 월드 좌표계로 변환하여 transform.position을 변경해주면, local 좌표 기준으로 캐릭터가 움직이는 것을 확인할 수 있다

 

+ 또 다른 방법

transform.Translate () 함수 사용

void Update()
{
    if (Input.GetKey(KeyCode.W))
        transform.Translate(Vector3.forward * Time.deltaTime * _speed);
    if (Input.GetKey(KeyCode.S))
        transform.Translate(Vector3.back * Time.deltaTime * _speed);
    if (Input.GetKey(KeyCode.A))
        transform.Translate(Vector3.left * Time.deltaTime * _speed);
    if (Input.GetKey(KeyCode.D))
        transform.Translate(Vector3.right * Time.deltaTime * _speed);
}

해당 함수는 기본적으로 Local 좌표계를 기준으로 삼기 때문에 좌표계를 변환하지 않고도 사용이 가능하다