캐릭터가 바라보고 있는 방향으로 이동 시키는 방법 / 즉 World 좌표계를 사용하지 않고 Local좌표계를 사용하고 다시 월드좌표계를 수정

위 사진을 보면 눈오리가 가운데에 서있다

이 친구의 월드좌표계는 위 사진과 같다

그런데 이 눈오리가 바라보고 있는 방향으로 가고 싶다면 

뭐 월드좌표를 사용해서

transform.position += Vector3.left * speed; 이런식으로 할 수 있겠지만 

캐릭터가 회전하면 Vector3.left가 아닌 다른 방식으로 또 수정해주어야 한다

var dir = Vector3.left;

rb.MovePosition(rb.position + (dir) * (speed * Time.deltaTime));

위와 같이 코드를 작성하면 캐릭터가 회전해도 그냥 이렇게 쭉 가는 거다

 

이러한 문제는 Local좌표계를 사용해서 쉽게 처리할 수 있다

눈오리가 어딜 바라보든 

앞 모습은 로컬 좌표계 기준 항상 (-)Z축을 바라보고 있다

var dir = Vector3.forward;

rb.MovePosition(rb.position + transform.TransformDirection(-dir) * (speed * Time.deltaTime));
TransformDirection

을 이용해 로컬좌표계를 월드좌표계로 바꿔준다

항상 캐릭터가 바라보는 방향으로 WorldPosition을 움직일 수 있다

 

World좌표계는 변하지 않는다 / 고정적인 값/

Vector3.forward는 방향벡터라고 생각하자

아ㅏ.................후..........

 

(좌) 로컬좌표계 (우) 월드좌표계

 

 

로컬좌표계를 월드좌표계로 바꿔준다는 말이 진짜ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ이해하기

어려웠다

그니깐 눈오리가 파란색 화살표로 가고 싶은데 월드좌표계에서는

Vector3.forward하면 되지만

지금 눈오리는 로컬좌표계니깐

Vector3.forward하면 오른쪽 사진처럼 (사진기준) 오른쪽으로 가버릴거임

그니깐  TransformDirection를 이용해 TransformDirection(Vector3.forward)을 하면 로컬좌표계에서 바라보고 있는 파란색 화살표를 향하도록 해줄 수 있음! 즉

움직이는 공간은 World좌표계지만 Local좌표계 Z축을 기준으로 움직이게 해준다는 뜻이지

 

그니깐 코딩하는 입장에서 복잡하게 생각하지말라고 유니티에서 제공하는 기능이라고 생각 ㄱ