05
31

Layer와 Collision Matrix를 활용하는 이유

기본 레이어를 사용하는 경우에 비해 각 유형의 오브젝트에 대해 별도의 레이어를 설정하면
아래와 같은 이점을 얻을 수 있다.

1. Collision Matrix를 사용하여 레이어 간 상호작용을 구성하면
  불필요한 충돌과 충돌 이벤트 테스트를 피할 수 있으므로, 이를 통해 성능 향상을 이룰 수 있다.

2. 레이어를 분리하고 Collision Matrix를 구성함으로써 불필요한 충돌을 피하고
  충돌 이벤트의 처리를 최소화할 수 있다.

3. 별도의 레이어를 사용하면 레이어 간 상호작용을 더 명확하게 설정할 수 있으며,
  문자열 비교와 같은 추가적인 처리를 피할 수 있다.

4. 프로파일러 데이터에서도 레이어를 분리하면 CPU 소비량이 줄어들어 성능 향상이 있음을 확인할 수 있다.

Raycast 사용에 도움이 되는 팁

Raycasting은 물리 엔진에서 제공하는 매우 유용하고 강력한 도구이다.
이를 사용하면 특정 방향과 길이로 광선을 발사하여 무언가에 맞았는지 여부를 알 수 있다.
그러나 이는 비용이 많이 드는 작업이다.
광선의 길이와 씬에 있는 콜라이더의 유형에 크게 영향을 받기 때문이다.
아래를 참고하여 Raycast를 사용하자
1. 필요한 만큼의 최소한의 광선을 사용

2. 광선의 길이를 필요 이상으로 늘리지 않기. 광선이 길수록 해당 광선을 테스트해야 할 객체가 많아진다.

3. FixedUpdate() 함수 내부에서 Raycast를 사용하지 않기.
  Update() 함수 내에서도 사용이 지나치게 많은 경우를 피해야 한다.

4. 사용하는 콜라이더의 종류를 주의하자. 메시 콜라이더에 대한 Raycasting은 매우 비용이 많이 든다.
  원시 콜라이더를 가진 자식 오브젝트를 생성하고 메시의 모양을 근사화하는 것이 좋다.

5. 부모 Rigidbody 아래에 있는 모든 자식 콜라이더는 하나의 복합 콜라이더로 작동한다.
  극도로 필요한 경우에만 메시 콜라이더를 사용하고, 가능하면 볼록(convex)한 형태로 만들자.

6. 광선이 충돌해야 하는 대상을 명확히 지정하고, raycast 함수에 layer mask를 지정하는 것이 좋다.
  이는 공식 문서에서 잘 설명되어 있지만, raycast 함수에서 지정하는 것은 레이어 ID가 아닌 비트마스크이다.
  예를 들어, ID가 10인 레이어에 속한 객체를 광선이 맞추기를 원한다면
  1<<10 (1을 왼쪽으로 10번 시프트)를 지정해야 하며, 10이 아닌 1<<10를 사용해야 한다.
  레이어 10을 제외한 모든 대상에 광선이 맞추기를 원한다면 비트별 보수 연산자(~)를 사용하면 된다.
  이는 비트마스크의 각 비트를 반전시킨다.

Rigidbody 컴포넌트가 부착되지 않은 오브젝트를 움직인다?

RigidBody 컴포넌트가 없는 게임 오브젝트(콜라이더 컴포넌트가 부착된)는 정적 콜라이더로 간주된다.

이때 정적 콜라이더를 이동시키려고 시도하는 것은 매우 비효율적이며,
이로 인해 물리 엔진이 물리적 세계를 전체적으로 다시 계산해야 하므로 비용이 많이 드는 것이다.

그러므로 게임 오브젝트를 이동할 때는 반드시 RigidBody를 추가해야 한다. 
만약 직접적으로 이동을 제어하려면 해당 RigidBody의 속성에서 kinematic을 체크하면 된다.

Fixed Timestep

Fixed Timestep은 Time Manager에서 Fixed Timestep 값을 조정하는 것으로,
이는 FixedUpdate() 및 물리 업데이트 속도에 직접적인 영향을 미친다.

이 값을 변경함으로써 정확도와 물리 계산에 사용되는 CPU 시간 사이의 좋은 균형을 찾을 수 있다.

물리 계산이 발생하는 빈도를 증가시키면(Increase the Fixed Timestep)
게임이 더 원활하게 실행되는 데 도움이 될 수 있지만, 정확도가 떨어진다.

유니티 공식 튜토리얼을 참고하여 작성하였습니다.
COMMENT