레이어마스크, 비트연산자
레이어 Layer
비트연산자
- AND(&) : 두 비트 필드 모두에게 해당 비트가 설정되어 있을 때
- OR(|) : 두 비트 필드 중 하나라도 해당 비트가 설정되어 있을 때
- XOR(^) : 두 비트 필드에서 해당 필드가 서로 다를 때만
- NOT(~) : 모든 비트를 반전. * -1
비트 시프트 연산
- 1 << n : 1을 왼쪽으로 n만큼 보낸다. 빈칸은 0으로 채움.
n번째 레이어를 나타내는 비트마스크를 생성하는 데 사용. 이를 통해 특정 레이어에 대한 연산을 쉽게 수행할 수 있다.
- 물리적 충돌, 레이캐스팅, 카메라 렌더링 등을 제어하는데 사용.
레이어 매칭 로직 구현
bool IsLayerMatched(int val, int layer)
{
return val == (val | 1 << layer);
}
- OR(|) 연산을 활용해서 두 비트를 더하는 개념으로도 사용할 수 있음.
- 이때 유의할 점은 동일한 위치에서 OR(|) 연산을 사용하면 값은 똑같다는 것.
위 함수는 그 점을 이용해서 두 비트를 비교한 것임.
사용
- 충돌 제어 : 비트마스킹을 사용해 특정 레이어에 속한 오브젝트에만을 대상으로 충돌 검사를 수행할 수 있다.
- 레이캐스팅 제어 : 레이캐스트가 특정 레이어의 오브젝트에만 반응하도록 비트마스크를 설정할 수 있다.
- 카메라 렌더링 설정 : 카메라가 특정 레이어의 오브젝트만을 렌더링하도록 설정하여,
게임의 시각적 요소를 세밀하게 제어할 수 있다.
투사체 로직
쿼터니언과 벡터의 곱셈
- Q * V : 쿼터니언을 벡터만큼 돌려라
- 순서에 유의 : 반드시 쿼터니언 * 벡터 순서.
private static Vector2 RotateVector2(Vector2 v, float angle)
{
return Quaternion.Euler(0f, 0f, angle) * v;
}
오브젝트 풀링
게임 성능을 개선을 위한 널리 알려진 테크닉.
- 비용이 큰 작업 : 생성과 소멸을 최소화시켜 성능을 향상시킴
- 미리 만들어두고 풀에서 꺼내 쓰고 넣는 방식.
- 더 필요한 경우 사용중인 가장 첫번째 것을 반납받고 다시 사용.
- 파티클 등 예외적인 경우
- 미리 만드는 것이 아니라, 필요할 때는 만들고 반납 받기.
문제
오브젝트 풀을 마음대로 쓸 경우 발생
- 100만개를 생성해서 쓰는 경우
- 100개가 필요한데 2개 미리 만들어두고 계속 생성시키는 경우
어떤 상황이냐에 따라 유동적으로 대처할 필요가 있음.