Accessing graph data
그래프와 노드에 접근하는 방법
그래프의 모든 데이터에 접근할 수 있습니다. 예를 들어, API에서 GraphNode를 매개변수로 기대하는 경우가 많으므로 이를 찾을 수 있어야 합니다. 또한 게임에 맞게 그래프 데이터를 광범위하게 수정해야 하는 경우도 있을 수 있습니다. 예를 들어, 자체 제작한 타일맵 생성기가 있고 해당 데이터를 그리드 그래프에 전달해야 할 수 있습니다.
참고: Graph Updates. 특정 지점 근처의 노드를 검색하는 방법에 대한 정보는 '노드 사용(Using nodes)'을 참조하세요. |
Accessing graphs
모든 그래프는 Pathfinding.AstarData 클래스에 저장됩니다. 이 클래스는 모든 그래프가 포함된 배열을 가지고 있으며, 그래프를 찾기 위한 여러 편리한 메서드를 포함하고 있습니다. 그러나 가장 빠른 방법은 제공된 단축키를 사용하는 것입니다. 각 내장 그래프 유형에 대해 해당 유형의 첫 번째 그래프를 가리키는 필드가 있습니다.
GridGraph gridGraph = AstarPath.active.data.gridGraph;
PointGraph pointGraph = AstarPath.active.data.pointGraph;
NavMeshGraph navmeshGraph = AstarPath.active.data.navmesh;
RecastGraph recastGraph = AstarPath.active.data.recastGraph;
LayerGridGraph layerGridGraph = AstarPath.active.data.layerGridGraph;
NavGraph[] allGraphs = AstarPath.active.data.graphs;
// 그래프 인스펙터에서 그래프의 이름을 설정할 수 있습니다
var graph = AstarPath.active.data.FindGraph(g => g.name == "My Custom Graph Name");
Getting nodes in a graph.
다양한 그래프 유형은 노드를 각각 다른 방식으로 저장합니다. 예를 들어, 그리드 그래프는 모든 노드를 거대한 배열에 저장하여 특정 셀 인덱스에서 노드를 쉽게 가져올 수 있습니다. Recast 그래프는 모든 노드를 개별 타일의 배열에 저장합니다.
그래프의 모든 노드를 가져오는 일반적이고 매우 상위 수준의 방법은 모든 그래프 유형에 존재하는 GetNodes 메서드를 사용하는 것입니다. 이 메서드는 각 노드에 대해 호출되는 콜백을 받습니다. 이 메서드가 반복자 대신 콜백을 사용하는 이유는 콜백이 반복자보다 훨씬 빠르기 때문이며, 대규모 그래프의 경우 이는 큰 차이를 만듭니다.
var gg = AstarPath.active.data.gridGraph;
gg.GetNodes(node => {
// 여기에 노드가 있습니다
Debug.Log("I found a node at position " + (Vector3)node.position);
});
경고 노드의 데이터를 업데이트하지 마세요. 이는 동시에 실행될 수 있는 경로 찾기와 충돌할 수 있습니다(특히 멀티스레딩을 사용하는 경우). 노드 데이터를 안전하게 업데이트하려면 안전한 콜백 내에서 이를 수행해야 합니다. AstarPath.AddWorkItem 을 사용하여 안전한 콜백을 요청할 수 있습니다. |
참고: Graph Updates |
GridGraph
그리드 그래프 노드는 큰 배열에 저장됩니다. 노드의 좌표에 의해 인덱싱되어 쉽게 접근할 수 있습니다. 노드에 접근하기 위한 편리한 메서드도 제공됩니다:
var gg = AstarPath.active.data.gridGraph;
int x = 5;
int z = 8;
GridNodeBase node = gg.GetNode(x, z);
런타임 중에 그리드 그래프의 크기를 변경해야 하는 경우가 있습니다. 이때는 월드 유닛 단위로 그리드의 크기를 나타내는 unclampedSize 필드를 수정할 수 있습니다. 또는 SetDimensions 메서드를 사용할 수 있습니다. 그래프의 너비나 깊이를 변경한 후에는 AstarPath.Scan 을 사용하여 다시 계산해야 합니다.
var gg = AstarPath.active.data.gridGraph;
var width = 80;
var depth = 60;
var nodeSize = 1.0f;
gg.SetDimensions(width, depth, nodeSize);
// 그래프를 다시 계산
AstarPath.active.Scan();
그리드 그래프를 다시 계산하지 않고도 RelocateNodes 메서드를 사용하여 이동할 수도 있습니다. 이 메서드는 다른 그래프에서도 사용할 수 있지만, 그 경우 필요한 행렬을 직접 계산해야 합니다.
Layered Grid Graph
레이어드 그리드 그래프는 그리드 그래프와 거의 동일하게 작동합니다. 그러나 레이어드 그리드 그래프는 여러 레이어를 포함할 수 있기 때문에 추가적인 레이어 좌표가 필요합니다.
var gg = AstarPath.active.data.layerGridGraph;
int x = 5;
int z = 8;
int layer = 0;
GridNodeBase node = gg.GetNode(x, z, layer);
NavmeshGraph/RecastGraph
Recast 그래프는 노드를 여러 타일로 나눕니다. 개별 타일은 그리드 그래프가 노드를 저장하는 방식과 동일하게 배열에 저장됩니다. 각 타일 내부에서 노드는 고유한 순서 없이 배열에 저장됩니다. 그러나 모든 노드는 축 정렬 경계 상자 트리(AABB 트리)에 추가되어 특정 지점에 가장 가까운 노드를 효율적으로 쿼리할 수 있습니다. Navmesh 그래프는 Recast 그래프와 동일하게 작동하지만 항상 단일 타일을 사용합니다.
var graph = AstarPath.active.data.recastGraph;
int tileX = 5;
int tileZ = 8;
NavmeshTile tile = graph.GetTile(tileX, tileZ);
for (int i = 0; i < tile.nodes.Length; i++) {
// ...
}
// or you can access the nodes like this:
tile.GetNodes(node => {
// ...
});
PointGraph
포인트 그래프는 노드를 고유한 순서 없이 배열에 저장합니다.
포인트 그래프 노드에는 생성된 GameObject에 대한 필드도 포함되어 있으며(있는 경우) 이는 다양한 용도로 유용할 수 있습니다.
var node = AstarPath.active.GetNearest(transform.position).node;
var pointNode = node as PointNode;
if (pointNode != null) {
Debug.Log("That node was created from the GameObject named " + pointNode.gameObject.name);
} else {
Debug.Log("That node is not a PointNode");
}
런타임 중에 포인트 그래프에 노드를 추가할 수도 있습니다:
AstarPath.active.AddWorkItem(new AstarWorkItem(ctx => {
var graph = AstarPath.active.data.pointGraph;
// 노드 2개를 추가하고 연결
var node1 = graph.AddNode((Int3)transform.position);
var node2 = graph.AddNode((Int3)(transform.position + Vector3.right));
var cost = (uint)(node2.position - node1.position).costMagnitude;
GraphNode.Connect(node1, node2, cost);
}));
Graph Updates 참조 |