• [작업] 2021.11.20 PM 08:35

게시물 주소 FONT글자 작게하기 글자 키우기

오랜만에 NavMeshAgnent 기능을 사용하여 경로를 계산해보았다.

기억하기론 각 오브젝트가 동시에 경로를 찾았기에, 육안으로 보기에는 거의 동시에 이동을 하는 것으로 알았으나, 실제로는 그렇지 않더라.


시스템상 이동하고자 하는 좌표가 주어지면, 경로를 계산한뒤 이동을 시작하게 되므로 다수의 오브젝트가 동시에 이동을 하는데 있어서 시간적 차이가 발생하게 된다. 즉, 먼저 경로를 계산한 오브젝트는 먼저 이동하고, 늦게 경로를 계산한 오브젝트는 늦게 이동한다는 것.


따라서 각 오브젝트에게 이동 좌표를 주고 경로만 미리 계산하게 한 뒤, 이동은 한꺼번에 시작하게 한다면 즉시 다수의 오브젝트가 이동을 시작하게 만들고자 여러 시도를 하였다.


public List<UnityEngine.AI.NavMeshAgent> Nav = new List<UnityEngine.AI.NavMeshAgent>();

public bool ReadyToGo;

 

먼저 오브젝트에 심어진 NavMeshAgent 들을 리스트로 관리하게끔 배열로 만든다.

 

 for (int i = 0; i < Nav.Count; i++)

        {

            UnityEngine.AI.NavMeshPath Path = new UnityEngine.AI.NavMeshPath();

            Nav[i].CalculatePath(Nav[i].transform.p-osition + Nav[i].transform.forward * 100, Path);

            Nav[i].path = Path;

        }

 

 

CalculatePath는 경로를 계산하는 함수로 괄호 내 특정좌표에 도달하기까지 경로를 계산한다. 계산된 경로는 각 NavMeshAgent의 path에 저장한다.

 

 

 

void CheckPathPending() {

        if (!ReadyToGo)

        {

            int counter = 0;

            for (int i = 0; i < Nav.Count; i++)

            {

                if (Nav[i].pathPending)

                {

                    break;

                }

                else

                {

                    counter++;

                }

            }


            if (counter >= Nav.Count)

            {

                GoTo();

                ReadyToGo = true;

            }

        }

 

    }

 

pathPending은 위의 얻어낸 경로에 도달하기까지 각 경로지점의 계산이 되었는지 체크한다. 참이면 경로지점이 온전하게 계산되지 않은것.

지속적으로 pathPending 유무를 체크하여하 하므로 이 함수는 Update에 넣는다. Update가 그러하듯 반드시 필요할때만 사용해야 리소스를 낭비하지 않으므로 bool값인 ReadyToGo를 통해 각 NavMeshAgent들의 경로계산이 전부 완료되었는지 판별한다. 전부 완료되었다면 ReadyToGo값은 참으로 바뀌므로 Update내에서는 더 이상 해당 함수는 동작하지 않는다.

댓글 : 0 개
친구글 비밀글 댓글 쓰기