[유니티 Tip] Transform 트랜스폼
씬을 봤을때
우리가 눈으로 보이고 코드를 짜는 C#공간이 있고
그 아래에 C++로 만들어진 엔진 공간이 있고
콜라이더와같은 Physics 물리 공간이 있다고 한다. (2D용, 3D용 따로 있다고 한다.)
transform.position을 하면 C#에서 먼저 움직이고 C++과 Physics에 영향을 주고
Animator 는 C++에서
rigidbody.AddForce 는 Physics에서 먼저 움직이고
세가지 공간이 모두 싱크를 맞추면서 움직인다고 보면 된다고 한다.
트랜스폼 스케일, 로케이션이 따로 있어 보이지만
엔진 내부에서 보면 매트릭스라는 4x4 행렬로 표현이 된다고 한다.
서로 다 영향을 미치는 존재라고 보면 된다고 한다.
수포자를 위한 게임수학 #17 검색하면 좋다고 함.
최적화 팁
위의 Update가 1번 / 아래가 2번이다.
position을 바꾸고 rotation을 바꾸고 하면 내부적으로 행렬을 2번 바꾸게 되는것이다.
그렇게 되면 연산이 거의 2배가 발생하게 된다.
position과 rotation을 바꾸게 될 경우에는 SetPositionAndRotiation함수를 이용하면
한방에 행렬을 갱신하기때문에 함께 바꿀때는 이 함수를 사용하는게 좋다.
** 많은 시스템에서 트랜스폼을 업데이트를 하고 있다면 모든 변경 사항들을 모아서 한 군데서 처리 할것!
이렇게 하게되면
Physics공간과 트랜스폼 공간
비효율적인 코드가 된다고 한다.
AutoSync Transform이라는 옵션이 있다.
계층적인 컴포넌트에서 가장 상위 오브젝트를 하나 움직이게되면
하위에 있는 컴포넌트들의 트랜스폼도 모두 update되어야 하기때문에 굉장히 비효율적이게 된다.
특히 캐릭터!
그래서 존재하는 옵션이
이 옵션의 역할은
캐릭터는 여러 계층구조로 깊이 이루어져 있으나
우리가 스크립트를 짤때 모두 하나하나 접근하는 경우는 거의 없다.
옵션을 누르면 하이어라키에서는 노출을 생략하며 API에서 접근할 수 없게 한다.
그렇게 하면 C++ 엔진에서는 살아있으니 애니메이션은 모습을 잘 움직이지만
겉으로는 생략하기때문에
성능을 잘 살릴 수 있다고 한다.
https://www.youtube.com/watch?v=QtmGT-22PqA