오늘은 A* 알고리즘을 구현해보려고 한다.



참고 블로그 및 사이트는

 

 

https://m.blog.naver.com/pkh879/221735054051

 

Unity - A* 알고리즘 구현하기 Part 2

이제부터는 실제로 Unity로 A* 알고리즘을 구현해보겠습니다. Part2에서는 맵을 만들고 그리드화해서 이...

blog.naver.com

 

를 참고 했다.

 

참고 사이트는 유니티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가 그려지게 된다.

 

 

+ Recent posts