비트마스크에 대한 간단한 튜토리얼
패키지의 여러 위치에서 사용되는 여러 비트마스크가 있습니다. 이 튜토리얼에서는 비트마스크의 사용법을 간단히 설명하겠습니다.
비트마스크란?
비트마스크는 옵션 집합을 활성화하거나 비활성화하는 효율적인 방법입니다. Unity와 이 패키지에서 공통적으로 사용되는 예로는 레이어 마스크가 있습니다. 레이어 마스크는 레이어 집합을 나타냅니다. 예를 들어, 빛이 있는 경우 레이어 마스크를 설정하여 빛을 비출 레이어를 결정할 수 있습니다. 이 패키지에서 레이어 마스크는 레이어, 그래프, 태그 및 RVO 레이어 집합을 선택하는 데 사용됩니다.
비트마스크는 단일 숫자로 표현되며, 일반적으로 32비트 정수로 표현됩니다. 이 숫자에는 32비트가 있으므로 32개의 옵션을 켜거나 끌 수 있습니다.
간단하게 설명하기 위해 3비트 숫자와 3개의 옵션 "A", "B", "C"가 있다고 가정해 봅시다. 이 3비트 숫자에서 첫 번째 비트를 사용하여 옵션 "A"가 활성화되었는지, 두 번째 비트는 "B"가 활성화되었는지, 마지막 비트는 "C"가 활성화되었는지 결정할 수 있습니다. 예를 들어, 이진수 110인 숫자 6은 "B"와 "C"가 활성화되었지만 "A"는 비활성화된 것을 의미합니다. 이와 같은 방법으로 32비트 숫자를 사용할 수 있습니다.
비트마스크 생성
코드에서 비트 시프트와 비트 논리합 연산을 사용하여 비트마스크를 쉽게 생성할 수 있습니다.
비트 시프트는 기본적으로 비트를 한 방향으로 이동합니다.
1 = 1 (이진수)
1 << 0 = 1 (이진수)
1 << 1 = 10 (이진수)
1 << 2 = 100 (이진수)
// 등등
57 = 111001 (이진수)
57 << 2 = 11100100 (이진수)
비트 논리합(OR)은 두 숫자 중 하나에서 비트가 1이면 비트를 1로 설정합니다.
옵션 0, 3, 4를 활성화하려면 개별 비트마스크를 생성한 다음 비트 논리합을 사용하여 결합할 수 있습니다.
var mask0 = 1 << 0; // 이진수: 00001
var mask3 = 1 << 3; // 이진수: 01000
var mask4 = 1 << 4; // 이진수: 10000
// 비트 논리합을 사용하여 마스크 생성
var fullMask = mask0 | mask3 | mask4; // 이진수: 11001
// 또는 결합하여 사용
var fullMask = (1 << 4) | (1 << 3) | (1 << 0); // 이진수: 11001
값 -1은 이진수로 모든 비트가 1로 표현됩니다. 따라서 -1은 모든 옵션이 활성화된 것을 의미합니다. 유사하게 값 0은 모든 옵션이 비활성화된 것을 의미합니다.
더 많은 정보는 Wikipedia의 관련 기사를 참조하세요.
패키지에서의 사용
패키지에서 비트마스크의 가장 일반적인 사용은 가장 가까운 노드를 검색할 때 검색할 그래프를 선택하는 것입니다. `NNConstraint` 클래스에는 'graphMask'라는 필드가 있으며, 이는 검색할 그래프를 결정합니다.
// 인덱스 0과 3의 그래프만 검색하는 제약 조건 생성
NNConstraint nn = NNConstraint.Walkable;
nn.graphMask = 1 << 0 | 1 << 3;
var info = AstarPath.active.GetNearest(somePoint, nn);
Seeker.StartPath 메서드에도 'graphMask'라는 매개변수가 있으며, 이는 Path.nnConstraint 객체로 전달됩니다. 동일한 방식으로 사용할 수 있습니다.
// 인덱스 0과 3의 그래프만 검색하는 경로 검색 예약
seeker.StartPath(startPoint, endPoint, null, 1 << 0 | 1 << 3);
다른 그래프를 나타내는 마스크를 작성하는 데 도움이 되는 `GraphMask`라는 내장 구조체도 있습니다:
GraphMask mask1 = GraphMask.FromGraphName("My Grid Graph");
GraphMask mask2 = GraphMask.FromGraphName("My Other Grid Graph");
NNConstraint nn = NNConstraint.Walkable;
nn.graphMask = mask1 | mask2;
// 'My Grid Graph' 또는 'My Other Grid Graph'에 있는 somePoint에 가장 가까운 노드를 찾습니다.
var info = AstarPath.active.GetNearest(somePoint, nn);
GraphMask 참조 |
'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글
Fast Facts (0) | 2024.05.29 |
---|---|
Frequently Asked Questions (0) | 2024.05.29 |
Upgrade Guide (0) | 2024.05.29 |
Misc (0) | 2024.05.28 |
Deploying for mobile/uwp (0) | 2024.05.28 |