본문 바로가기
유니티 최고/유니티 구현

유니티(Unity) Grid지도 만들어 길찾기 구현하기(1)

by Lee_story_.. 2023. 5. 17.
728x90

유니티를 이용한 길찾기 를 구현해보기 위해 글을 작성하게 되었습니다.

길찾기 알고리즘은 상당히 다양하기에 각각의 알고리즘을 사용해볼 계획입니다.

 

그러기 위해서 Grid 지도를 생성해보고 LineRenderer를 이용해 보겠습니다. 

 

 

 

오늘 결과물은 아래처럼!

 

 

그럼 시작!


머저 동일한 간격으로 큐브를 생성해 보겠습니다.

이 부분은 단순 2중 for문을 이용해서 생성할 수 있기에 코드만 첨부 하겠습니다!

 

그리드 생성!

 public void Grid() // 100칸 
    {
        tempX =10;
        tempY =10;

        float NowX = -22.5f;
        float NowZ = -22.5f;


        for(int i=0;i< tempX; i++)
        {
            NowZ = -22.5f;
            for (int j = 0; j < tempY; j++)
            {
                GameObject temp = Instantiate(spw);
                
                temp.transform.position = new Vector3(NowX,0, NowZ);

                GridObj.Add(temp);

                NowZ += 5f;
            }
            NowX += 5f;
        }       
    }

 

 

이제 여기다가 장애물 표시를 해줄수 있게끔 변수배열을 선언해주고

public bool[] Check = new bool[100];

 

머터리얼 변경과 모든 큐브에 대한 방향 코드를 생성해 줍시다. 

 

 

장애물 큐브설정

 public void hideGrid()
    {
        for(int i = 0; i < GridObj.Count; i++)
        {
            MeshRenderer temp = null;
            temp = GridObj[i].GetComponent<MeshRenderer>();
            temp.GetComponent<CubeNum>().numCh(i);
            if (Check[i] == true)
            {
                temp.material = red;
            }
        }

        for (int i = 0; i < GridObj.Count; i++) // 경로기록
        {
            way[i]=makeCode(i);
        }
    }

 

코드를 생성하는 부분은 숫자 계산을 통해 구현 하였습니다. 만약 그리드 형식이 아니라면 변경 가능합니다!

 

 

코드 생성

public string makeCode(int num)
    {
        string answer = "";
        for(int i = 0; i < 4; i++)
        {
            if (num % 10 == 0 && i==2)
            {
                answer += '0';
                continue;
            }

            if (num % 10 == 9 && i ==3)
            {
                answer += '0';
                continue;
            }

            if (dCheck[i] + num < 100  && dCheck[i]+ num >= 0 && !Check[num])
            {
                if (Check[dCheck[i] + num] != true)
                {
                    answer += "1";
                }
                else
                {
                    answer += "0";
                }
            }
            else
            {
                answer += "0";
            }
        }

        return answer;
    }

 

코드는 순서대로 왼 오 아래 위 순서대로 갈수있다면 1, 없다면 0 으로 체킹되게 만들었습니다. 

 

 

ex ) 46의 경우 1101

 

 

다음은 코드를 기반으로 갈수있는지를 확인하여 길을 그려 주었습니다. 

 

라인 생성!

public void paintLine()
    {
        LineRenderer temp;
        List<Vector3> memo=new List<Vector3>();// 라인이 그려질 포인트들
        for (int i = 0; i < GridObj.Count; i++)
        {
            temp = GridObj[i].GetComponent<LineRenderer>();
            temp.startWidth = .5f;
            temp.endWidth = .5f;
            memo.Clear();

            if (Check[i] == true)
            {
                temp.enabled = false;
                continue;
            }

            for (int j = 0; j < 4; j++)
            {
                if (way[i][j] == '1')
                {
                    memo.Add(GridObj[i].transform.position); // 시작점과!
                    memo.Add(GridObj[dCheck[j] + i].transform.position);//다음점!
                }
            }
    
            temp.positionCount = memo.Count;
            temp.SetPositions(memo.ToArray());
        }
    }

 

코드에 대한 자세한 설명은 아래 링크에 있습니다!

 

유니티(Unity) LineRenderer를 이용한 여러 객체 연결하기

LineRenderer란? 두 지점간의 라인을 그려줄때 사용하는 함수로 아래 처럼 그려 줄 수 있습니다. 약간 스플라인 느낌으로 좌표상의 길을 깔아 줄 수 있게 해주는 컴포넌트입니다. 컴포넌트를 보게

ljhyunstory.tistory.com

 

큐브와 머터리얼을 넣어주고

 

여기까지 코드를 구성한뒤 장애물 큐브를 무작위로 생성하면!

 

 

잘 구현된것 같습니다. 

 

 

다음 글에서는 이를 토대로 길찾기를 구현해 볼 생각입니다. 

다익스트라 알고리즘과 a*...? 알고리즘중 하나를 구현 해보도록 하겠습니다!

 

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글