-
24년 6월 13일 TIL공부 기록 2024. 6. 13. 11:50
RaycastHit의 point와 normal 등등
ray는 한 오브젝트가 여러 개 쏠 수 있고 ray마다 다른 Rayer를 확인 할 수 있게 한다. 숙련주차 강의에서 플레이어는 계속해서 ray를 쏘는 게 있고 자원 채취용 ray를 쏘는 게 있다. 공격을 하게 되면 ray를 쏘고 이 ray는 Resource라는 Rayer와 충돌하면 hit에 담게 했다.
나는 처음에 오브젝트에 마우스 갖다대면 정보 텍스트가 나왔는데 왜 안나오지 Rayer를 설정해야 하나 생각 하다가 다른 Ray인 거를 알았다. 자막텍스트가 안 나오는 거다. ray 한 번 쓱 쏴서 나무 떨어지게 했다.
그리고 카메라는 ray 한 번밖에 못 쏘는 줄 알았는데 여러 개 쏠 수 있다. 그래서 Camera.main 여러 번 쓸 수 있다.
AI Navigation
유니티에서 제공 해주는 기능으로 오브젝트가 자동으로 행동 하게 하기 위해서 직접 코딩을 했어야 했는데 이 기능을 활용함으로써 매우 간단하게 기능을 구현 할 수 있게 되었다.
주요 기능으로는
네비게이션 매쉬
3D 공간을 그리드로 나누어 이동 가능한 지역과 장애물이 있는 지역을 구분 하는 메쉬이다.
캐릭터가 이동 할 수 있는 공간과 없는 곳을 계산해서 최단거리로 자동으로 이동 하게 한다.
주로 A* 알고리즘이 사용 된다고 한다.
장애물을 피하는 기능은 carving 시스템이란 것으로 장애물을 피해서 위치로 이동 하게 한다.
각종 센서나 알고리즘을 사용하여 장애물을 감지하고 피한다.
그리고 근전 회피라고 여러 캐릭터나 NPC가 서로 충돌하지 않도록 하는 기술도 있다.
캐릭터들 사이의 거리를 유지하고 회피동작을 수행 하게 한다.
아주 기본적인 기능들이고 많은 기능들이 있을 것 같다. 나중에 집요하게 파봐야겠다.
사용방법
윈도우 패키지에서 AI Navigation 설치.
Window-> AI -> Navigation(Obolete)
Areas 오브젝트들에게 Rayer를 걸 수 있다.
기본은 걸어다닐 수 있는 곳, 아닌 곳, 점프가 있다.
Object탭을 누르고 오브젝트들을 클릭 하면 Navigation Area를 확인 할 수 있다.( 걸을 수 있는 곳, 아닌 곳 등등)
그리고 이 정보들을 가지고 있는 것을 Bake를 해줘서 인지 할 수 있게끔 해줘야 한다.
Bake 탭에서 설정 할 오브젝트를 누르고 Bake를 누르게 되면 영역들이 표시가 된다. 설정이 된 Rayer들로
그리고 우선순위도 정해줄 수가 있다. 다리라던지 늪 같은 것들이 있을 때 Rayer를 통해서 우선순위를 적용 할 수 있고, 그리고 특정 영역일 때 속도가 느려지게 한다라던지 여러가지가 가능 하다.
오브젝트에 Nav Mesh Spstacle 컴포넌트를 붙여주면 해당 게임 오브젝트를 장애물로 인식 하게 되어서 AI가 피해 가게끔 할 수 있다. Carve를 체크 해주면 영역이 표시가 되면서 AI가 피해갈 수 있게 적용 할 수 있다.
Move Threshold - 세팅 된 값만큼 오브젝트가 움직이게 되면 세팅 된 값만큼 영역을 다시 계산 해주게 된다.
Time To Stationary - 장애물이 멈추게 되었다고 인지 하게 되는 시간이다.
Carve Only Stationary - 장애물이 정지 되고 있을 때만 구멍을 판다라는 것인데 멈췄다고 인지를 한 순간에 구멍을 뚫어주는 거라고 하면 된다. 그런데 Carve를 통해 이동되는 장애물에 대해서 구멍을 뚫어주는 것은 연산량이 굉장히 많이 소모가 된다고 한다. 그래서 성능에 문제가 없게끔 세팅을 해줘야 할 것이다.
AI를 달아줄 오브젝트에 Nav Mesh Agent 컴포넌트를 추가 하면 된다.
코드로 가져오려면 using.UnityEngine.AI 를 사용 해줘야 한다.
내가 옛날에 생각이 낫던 기능을 평소에 어떻게 구현 하나 생각 하고 있었는데 오늘 스댕 특강 보면서 할 수 있을 것 같았다.
NavMeshAgent 의 isOnOffMeshLink 를 이용 하는 것 같은데, 일단 나중에 제대로 알아보자. 지금은 안 됨.
'공부 기록' 카테고리의 다른 글
24년 6월 16일 TIL (0) 2024.06.17 24년 6월 14일 TIL (0) 2024.06.14 24년 6월 12 TIL (0) 2024.06.12 24년 6월 11일 TIL (0) 2024.06.11 24년 6월 10일 TIL (0) 2024.06.10