오늘은 A* 알고리즘을 구현해보려고 한다.
참고 블로그 및 사이트는
https://m.blog.naver.com/pkh879/221735054051
를 참고 했다.
참고 사이트는 유니티3D로 진행을 했기 때문에,
이 글에선 2D로 수정을 해서 진행 할 것이다.
+++++
우선 Node.cs와 Grid.cs 스크립트 파일을 만든다.
using UnityEngine;
public class Node
{
public bool isWalkAble;
public Vector2 worldPos; // 2D
public Node(bool walkable, Vector2 worldPosition)
{
isWalkAble = walkable;
worldPos = worldPosition;
}
}
Node.cs
노드(Node)클래스는 이동 가능 여부와 포지션(Vector3)를 변수로 갖는다.
using UnityEngine;
public class Grid : MonoBehaviour
{
public LayerMask unwalkableMask;
public Vector2 gridWorldSize;
public float nodeRadius;
Node[,] grid;
float nodeDiameter;
int gridSizeX, gridSizeY;
void Start()
{
nodeDiameter = nodeRadius * 2;
gridSizeX = Mathf.RoundToInt(gridWorldSize.x / nodeDiameter);
gridSizeY = Mathf.RoundToInt(gridWorldSize.y / nodeDiameter);
CreateGrid();
}
void CreateGrid()
{
grid = new Node[gridSizeX, gridSizeY];
Vector2 worldBottomLeft = (Vector2)transform.position - Vector2.right * gridWorldSize.x / 2 - Vector2.up * gridWorldSize.y / 2;
for (int x = 0; x < gridSizeX; x++)
{
for (int y = 0; y < gridSizeY; y++)
{
Vector2 worldPoint = worldBottomLeft + Vector2.right * (x * nodeDiameter + nodeRadius) + Vector2.up * (y * nodeDiameter + nodeRadius);
bool walkable = !(Physics2D.OverlapCircle(worldPoint, nodeRadius, unwalkableMask));
grid[x, y] = new Node(walkable, worldPoint);
}
}
}
void OnDrawGizmos()
{
Gizmos.DrawWireCube(transform.position, new Vector3(gridWorldSize.x, gridWorldSize.y, 1));
if (grid != null)
{
foreach (Node n in grid)
{
Gizmos.color = (n.isWalkAble ? Color.white : Color.red);
Gizmos.DrawCube(n.worldPos, Vector3.one * (nodeDiameter - .1f));
}
}
}
}
Grid.cs
그리드 클래스는 설정한 x,y 값을 기준으로 범위를 만들고,
설정된 지름만큼 범위 안에 노드들을 생성한다.
그리고 빈 오브젝트(A* Manager)를 생성
A* Manager에 Grid 스크립트를 추가하고,
피해 갈 Layer와 맵의 크기에 맞게 x,y 값을 넣어준다.
(Node Radius도 0.5 정도로 조정해주자. 수치가 0이면 OverflowExeption 오류가 날 수 있다.)
맵의 크기와 비슷하게 지정된 모습
적(larva)을 생성하고
Layer를 Enemy로 지정해준다.
그리고 Box Collider 2D 컴포넌트를 추가
그리고 게임 씬을 실행 하면
다음과 같이 적들이 있는 갈 수 없는 위치(unWalkable)는 빨간색,
갈 수 있는 위치는 하얀색으로 Gizmo가 그려지게 된다.
'산대특 > 게임 플랫폼 응용 프로그래밍' 카테고리의 다른 글
A* 알고리즘 구현해보기 (3) - 구해진 경로를 따라 오브젝트 이동 시켜보기 (0) | 2024.03.04 |
---|---|
A* 알고리즘 구현해보기 (2) - 출발 지점에서 목표 지점까지 경로 구하기 (0) | 2024.03.03 |
Larva 클릭 및 드래그로 TargetPoint 지정하기 (0) | 2024.03.01 |
화면을 클릭할때까지 기다리다가 2초마다 "대기중" 이라고 출력하고, 화면을 클릭하면 "완료" 라고 출력하기 (0) | 2024.02.29 |
코루틴 안에서 코루틴 실행하기 (0) | 2024.02.29 |