경일 메타버스 20220722 16주차 5일 수업내용. 유니티 & C# - 좀비 서바이버 : 내비게이션 시스템, 내브메쉬 NavMesh, 동적 콜라이더 Overlap, foreach문
유니티에서 제공하는, 한 위치에서 다른 위치로의 경로를 계산하고 실시간으로 장애물을 피하며 이동하는 인공지능을 만드는 시스템
매뉴얼 : https://docs.unity3d.com/kr/current/Manual/nav-NavigationSystem.html
내비메시(NavMesh) :
에이전트가 걸어 다닐 수 있는 표면
내비메시 에이전트( NavMesh Agent) :
내비메시 위에서 경로를 계산하고 이동하는 캐릭터 또는 컴포넌트
내비메시 장애물 :
에이전트의 경로를 막는 장애물
오프메시 링크(Off Mesh Link) :
끊어진 내비메시 영역 사이를 잇는 연결 지점
뛰어넘을 수 있는 울타리나 타고 올라갈 수 있는 담벼락 등을 구현하는데 사용
내비메시 빌드 (굽기)
내비게이션은 연산을 많이 사용하기에, 미리 데이터를 계산하여 내비메시를 구워 놓고 사용한다.
정적 게임 오브젝트를 대상으로 생성된다.
NavMeshAgent.SetDestination(Vector3) :
목적지 설정
NavMeshAgent.isStopped :
에이전트가 멈출지 bool 값
NavMesh.SamplePosition(원점, 샘플링 결과, 최대 거리, 에어리어 마스크) :
bool SamplePosition (Vector3 sourcePos, out AI.NavMeshHit hit, float maxDis, int areaMask)
원점 sourcePos로부터 최대 거리 maxDis의 반경 안에서 (즉, 반지름 maxDis의 구 안에서),
원점과 가장 가까운 NavMesh 위의 점을 찾는다.
가장 가까운 점을 찾으면 true를 반환한다.
Collider[] Physics.Overlap~() :
- 동적 콜라이더 생성 메소드. 새로운 콜라이더를 동적으로 생성한다.
- 이에 충돌, 접촉하는 콜라이더를 반환한다.
int Physics.Overlap~NonAlloc() :
- 동적 콜라이더 생성 메소드. 새로운 콜라이더를 동적으로 생성한다.
- 이에 충돌, 접촉하는 콜라이더의 수를 반환한다.
foreach문 :
- 배열, 콜렉션 등의 전체를 순회하고자 할 때 사용할 수 있는 for문
- foreach(타입 변수명 in 배열명)
Debug.Assert(조건문) :
조건을 확인하고, 값이 false면 메시지를 출력하고 호출 스택을 보여주는 메시지 상자를 표시한다.
카메라(Camera)와 빛(Ray)의 컴포넌트를 활용하면, 카메라에 비치는 스크린의 마우스 포인터의 위치를 얻을 수 있다.
Camera.main :
메인 카메라 컴포넌트를 가리킨다.
Camera.ScreenPointToRay(Vector3) :
카메라에서 스크린 위 한 점으로 이어지는 광선을 그린다.
Input.mousePosition :
입력에서, 마우스의 현재 위치를 가리킨다.
스크린의 왼쪽 아래가 원점 (0, 0),
오른쪽으로 갈수록 ++x, 위쪽으로 갈수록 ++y
LayerMask는 정수의 리스트로 번호 매겨지며, 그 번호마다 비트 연산(0 or 1)을 하여 1이면 충돌, 0이면 충돌하지 않음으로 구분한다.
⇒ 따라서 코드적으로 LayerMask를 이용하려면 비트 연산을 사용해야 함에 주의하자.