초고교급 희망

[Unity] TIPS 알아두면 쓸 데 있는 '트랜스폼' 본문

Game/Unity

[Unity] TIPS 알아두면 쓸 데 있는 '트랜스폼'

연모링 2023. 7. 12. 23:40
728x90

1. Unity 구성

우리가 코드로 접근하는 것은 C#이지만 엔진 내부의 공간은 C++로 이루어져있다.

Physics는 물리 충돌을 위한 공간. 2D용과 3D용 물리엔진이 따로 있음

transform에 C#으로 접근하면 엔진 내부 C++와 물리엔진 공간 모두에 영향을 미친다.

오버로드 되어 있는 translate코드들-> 내부에 어떻게 생겼는지 깃허브에서 c++로 볼 수 있다.

 

Box2D의 내부 코드

C#과 C++과 물리엔진 세 가지의 세계 중,

한 세계에서 변화를 주면 나머지 두 공간에서도 싱크를 맞추기 위한 코드가 호출된다.

 

포지션을 하나 움직인다고 해서 독립적으로 작동하는 것이 아니라 로테이션에도 영향을 미친다. 서로 다 영향을 미치는 존재. (수포자를 위한 게임 수학이라는 책에 자세히 나온다고 함..(?) 네? 갑자기 책광고)

 

리지드바디를 생성하면 Scene  내에 물리공간을 따로 생성한다.

 

2. SetPositionAndRotation

포지션과 로테이션을 바꾸면 행렬을 두번 갱신하게 된다.

대략 연산이 두배 발생한다.

그래서 포지션과 로테이션을 동시에 바꿀 때는 

SetPositionAndRotation라는 함수를 쓰면 한 번에 변경할 수 있어서 효율적이다.

 

많은 시스템에서 트랜스 폼을 업데이트를 하고 있다면 모든 변경 사항들을 모아서 한 군데서 처리할 것

 

트랜스폼을 직접 건들이는 것이 아니라 임시 변수같은걸 만들어서 트랜스폼은 한군데에서만 바꿀 수 있도록.

 

비효율적인 연산의 예시

리지드바디는 물리엔진 영역이고 transform은 C++에서 처리하는 것이다.

근데 두개를 한 번에 건들이면 비효율적인 연산이 일어난다.

 

Transform 변환 -> Rigidbody 갱신 -> Rigidbody 연산 업데이트 -> Transform 업데이트

서로 상호작용이 일어난다.(쓸데없이 서로 계속 연산해서 낭비다.)

 

트랜스폼은 트랜스폼대로 움직여서 리지드바디를 움직이게 되는데 물리공간에서도 스스로 변경이 일어난다.

 

게임로직상 저렇게 하는게 불가피할 상황에는

Physics의 Auto Sync Transforms라는 설정이 있음

트랜스폼.포지션 해서 움직이면 피직스 공간에 있는 리지드 바디도 업데이트 해야해서 트랜스폼을 변경할 때 물리공간을 늘 업데이트할건지 아니면 쌩깔건지 설정하는 옵션

 

3. Transform -> Hiearachy 계층구조

트랜스폼은 하이어라키로 존재한다.

이그잼플 에셋의 트랜스폼을 움직이게 되면 하위의 모든 트랜스폼이 변경된다.

씬에 있는 계층구조가 굉장히 많다면 상위에 있는 오브젝트 트랜스폼 하나 변경 했을 뿐인데 생각보다 많은 일을 하고 있을 수가 있다.

계층구조를 간단하게 하는 것을 추천!

스태틱한 것은 ㄱㅊ은데 동적인 것들은 간단하게.

 

하지만

하이어라키가 깊어질 수 밖에 없는 상황, 예시-> 캐릭터(팔,다리,등 계층구조임)

만약 화면에 캐릭터 한두개다->ㄱㅊ

근데 캐릭터가 백마리잇다면?비효율

그래서

Optimize Game Object라는 옵션이 있다.

사용하는 리소스만 계층 구조에 노출하여 트랜스폼 연산을 절약할 수 있다.

접근성이 떨어질 수는 있지만 성능을 향상시킬 수 있다.

Extra Transforms to Expose 방패나 칼 같은거, api로도 접근 가능하고 하이어라키에도 접근 가능하게 해줌.

 

https://www.youtube.com/watch?v=QtmGT-22PqA 

 

 

728x90