내비게이션 시스템 2 - NavMeshAgent와 NavMeshObstacle | 유니티

  Рет қаралды 9,317

WER's GAME DEVELOP YOUTUBE

WER's GAME DEVELOP YOUTUBE

Күн бұрын

유니티의 내비게이션 시스템 중에서 NavMesh 위에서 길을 찾아서 움직일 NavMeshAgent와 NavMeshAgent의 이동을 방해하는 NavMeshObstacle에 대해서 알아봅시다.
타임라인
0:00 인트로
0:30 - NavMeshAgent 세팅하기
1:08 - NavMeshAgent를 움직이게 만들 스크립트 작성하기
2:13 - NavMeshAgent 길찾기 테스트하기
2:50 - NavMeshAgent의 프로퍼티 확인하기
2:57 - Base Offset
Steering 파트 프로퍼티
3:18 - Speed
3:36 - Angular Speed
4:14 - Acceleration
4:40 - Stopping Distance
5:09 - Auto Breaking
Obstacle Avoidance 파트 프로퍼티
6:09 - Obstacle Avoidance 파트 프로퍼티 테스트용 세팅
6:39 - 기본 상태 테스트
6:55 - Radius
7:29 - Height
7:39 - Quality
8:09 - Priority
Path Finding 파트 프로퍼티
8:52 - Auto Repath
9:21 - Area Mask
9:51 - NavMeshObstacle 세팅하기
10:12 - NavMeshObstacle의 모양과 크기 설정
10:31 - 기본 상태 회피 테스트
10:58 - Navigation Static 지형과 NavMeshObstacle의 차이점
11:36 - NavMeshObstacle의 Carve
12:20 - NavMeshObstacle의 Move Threshold
12:48 - NavMeshObstacle의 Time To Stationary
13:17 - NavMeshObstacle의 Carve Only Stationary
14:16 - 트리거가 발동하면 장애물이 떨어져서 길을 막는 기능 구현해보기
본 영상의 오프닝은 비디오몬스터를 이용해서 만들어졌습니다.
videomonster.com/
[유니티 어필리에이트 프로그램]
아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.
- 유니티 에셋스토어 : prf.hn/l/vJl41D5
- 유니티 플러스 : prf.hn/l/wLNyJZG
- 유니티 프로 : prf.hn/l/qXOybmp
[투네이션]
toon.at/donate/63773521276146...
[Patreon]
/ wergamedevchan
#유니티강좌 #길찾기 #게임만들기

Пікірлер: 44
@kokku1486
@kokku1486 3 жыл бұрын
네비게이션 시스템에 대해 전혀 몰랐는데 이해가 쏙쏙 되네요! 좋은 영상 감사합니다.
@yowallcat4183
@yowallcat4183 2 жыл бұрын
동적 네비 검색하다가 많이 배우고 갑니다. 감사합니다.
@gongjunyeol
@gongjunyeol 8 күн бұрын
설명 진짜 잘한다
@사쿠노
@사쿠노 10 ай бұрын
감사합니다.
@user-pj7dm9hj1k
@user-pj7dm9hj1k 2 жыл бұрын
당신 정말 대단해
@gorani_TV
@gorani_TV 4 жыл бұрын
오 겁나 신기해요. 되게 잘 만드셨네요
@wergia
@wergia 4 жыл бұрын
AI가 들어가는 3D 게임에는 필수입니다
@wergia
@wergia 4 жыл бұрын
@IN SHOW 엔진으로 게임을 만들다보면 엔진의 특성을 타는 느낌이 나기도 하죠. 그런 느낌을 지우기 위해서는 엔진을 최대한 커스터마이징하는게 중요합니다 ㅎㅎ
@user-ho4lm5rm9m
@user-ho4lm5rm9m 4 жыл бұрын
NavMesh에 대한 자세한 설명 너무 좋아요! 저 같은 경우에는 이런 AI를 2D에서 구현해야하는데, 에셋스토어에 2d NavMesh라는 에셋이 존재하기도 하고(유로라서 사용해보지는 못했어요..), 2D에서는 보통 A* PathFinding을 자주 사용하더라구요. 이렇게 2D에서 NPC가 플레이어를 따라오거나 이 영상에서 했던 것들과 비슷한 기능을 하는 방법을 다루어 주실 수 있으신가요?
@wergia
@wergia 4 жыл бұрын
실제로 2D 게임에서는 NavMesh보다는 A* 알고리즘을 훨씬 더 많이 쓰죠. 2D 내비게이션 메시 시스템을 만드는건 당장 연구 기간도 오래 걸릴 것 같으니 간단하게 3D 게임에서 사용되는 NavMesh를 2D에서 사용하는 꼼수에 대한 영상을 제작해보겠습니다 ㅎㅎ
@user-ho4lm5rm9m
@user-ho4lm5rm9m 4 жыл бұрын
@@wergia 오오오! 그런 방법이 있나요?! 다뤄주신다면 정말 감사합니다~!!
@kycho4653
@kycho4653 3 жыл бұрын
@@wergia 혹시 해당 3D 구현 영상에서의 NavMesh에서는 path finding 알고리즘이 에이스타가 아닌건가요??
@user-rn2hr6cn3q
@user-rn2hr6cn3q 3 жыл бұрын
강의 퀄리티 너무 좋네요 혹시 베르의 프로그래밍 노트 블로그 주인이신가요? 도움 많이 받았는데 ㅎ..
@wergia
@wergia 3 жыл бұрын
네 유튜브도 시작했어요 ㅎㅎ
@user-rn2hr6cn3q
@user-rn2hr6cn3q 3 жыл бұрын
@@wergia 실력 너무 좋으신거 같아요 부럽습니다ㅠ
@wergia
@wergia 3 жыл бұрын
@@user-rn2hr6cn3q 그렇게 실력이 좋진 않지만 꾸준히 하고 있어요! 상민님도 꾸준히 하시면 금방 저만큼 하실 수 있을거에요!
@susi2622
@susi2622 3 жыл бұрын
베르님 영상 잘 보고 있습니다. 비기너로써 답이 잘 나오지 않는 부분에 대해서 질문 드려볼까 합니다. 보통 게임매니저를 사용하면 스크립트 하나에 혹은 오브젝트 하나에 엄청난 양의 코드가 한번에 들어가져서 비정상적으로 비대해져서 관리가 힘들기 때문에 권장하지 않는다는데, 보통 코드들을 어떻게 나눠야 할 지 궁금합니다. 개인마다 그리고 게임장르나 특성에 따라 다르겠지만, 방향성을 제시해주실 수 있나요? 그리고 데이터 저장에 대해서도 다른 유투버분들 영상 보면서 구글링도 해보니 JSON으로 직렬화 하고 인코딩해서 파일화 한다고 하더라구요. 그런데 아무래도 직렬화 및 암호화까지 들어가 있어서 이를 해독하기란 쉽지 않겠지만, 안전성에 관련해서 궁금한 것이 게임을 다운 받은 유저가 해당 파일을 C#에서 디코딩하여 읽는다면 해독당하지 않나요?? 물론 엄청난 시간이 걸리겠지만, 보통 게임진행도에 대해선 JSON으로 불러오기 및 특정 이벤트에 저장하여 흐름을 잡는 듯한데, 이 부분에 대해서도 궁금합니다.
@wergia
@wergia 3 жыл бұрын
1. 게임 매니저 클래스는 비대화는 확실히 문제가 되는 편입니다. 하지만 개발 편의성을 위해서는 게임 매니저 클래스를 어쩔 수 없이 사용하게 되죠. 이 문제에 대해서는 여러 개발자 분들이 각자 자신의 견해나 해결책이 있겠지만, 저 같은 경우에는 게임 매니저 클래스를 사용하되, 게임 매니저 클래스에 모든 기능들을 구현하지 않고, 각 기능을 단위별로 클래스를 따로 만들어서 기능을 담당하는 각 클래스를 게임 매니저 클래스가 소유하는 방식으로 주로 설계를 합니다. 그리고 이 게임 매니저 클래스는 각 기능을 호출하고 관리하는 통로로써의 역할을 맡기는 편입니다. 이 정도의 기능만 게임 매니저 클래스에 맡기면 게임 매니저 클래스의 비대화를 최대한 억제하면서 기능 별로 클래스를 분리할 수 있다고 생각합니다. 2. 게임 보안에 관련해서는 제가 전문 분야가 아니라 섣불리 이야기를 드릴 수는 없지만, 말씀하신 것처럼 데이터를 다룰 때는 주로 JSON 혹은 XML로 직렬화하고 암호화해서 저장합니다. 그리고 그렇게 암호화해서 저장한 파일을 디코딩 하려면 암호화를 해제하는 키가 필요해서 암호화 해제하는게 그리 쉬운 편은 아니라고 생각합니다. 디코딩해서 수정하면 안될 데이터라면 애초에 파일이 아니라 서버에 저장하는 방식으로 할 테구요. 음 제가 지식이 부족해서인지 지금은 이 정도로 밖에 답을 드릴 수 없을 것 같네요 ㅎㅎ
@susi2622
@susi2622 3 жыл бұрын
@@wergia 이렇게 시간내주셔서 답변해주실거라 생각 못했는데 너무 감사드립니다. 처음에 게임매니저에 이벤트에 관련된 기능을 수행시키고자 했는데 어느덧 몸짓이 매우 비대해지더군요. 그래서 클래스를 따로 만들고 게임매니저 오브젝트에 붙여주는 식으로 하니 인스펙터에서 시각적으로 관리가 되고 다른 클래스에서 접근 할 때에도 조금 더 편리하고 코드가 짧아졌습니다. 처음에는 잘 느끼디 못 했지만, 이런 저런 기능을 만들어두고보니 게임개발이 어려운 이유는 게임기능구현이 아닌 그외의 요소인 것 같습니다. 시각적으로는 UI부터 시작해서 캐릭터와 애니메이션 그리고 셰이더 같은 고급기능들. 그리고 프로그래밍으로 보면 데이터의 관리가 가장 고된 부분인 듯 합니다. 아마 다른 개발하시는 분들도 같은 마음이실 것 같은데... 정말 실력있는 해커가 아닌 프로그램이나 앱을 이용하는 일반유저의 공격에 대비한 방어를 기본적으로 염두해 두고 게임에 중요한 데이터의 관리와 결제 부분에 대해 코드를 짤 것 같아요. 처음 유니티를 접할 때 유투브를 보며 간단한 게임 만들고 따라하면서 원커맨드로 ~만들기 같은 것에 대해 재미는 느꼈지만, 시간이 흐르니 만약 제대로된 게임을 만들고 싶다면 보안부분이 7할 정도가 게임빌드에 관여되는 것 같습니다. 게임의 기본재화인 골드나 중요재화인 유료재화의 경우 게임에 막대한 영향을 미치는 요소이기 때문에 유저에 의해 조작되거나 훼손되어서는 안되는데, 얕은 지식으로도 클라이언트에 이런 정보를 저장하면 안되기 때문에 프로그램 내 선언된 유저 클래스 변수는 서버에서 받아온 데이터를 담는 그릇으로 이용하는 코딩을 해야하는 걸로 이해하고 있습니다. 여기서 한 가지 궁금한 점이 있는데, 간단하게나마 답변해주시면 정말 감사하겠습니다! 게임플레이는 보통 Update, 쿨타임 같은 경우는 Coroutine이 주로 이루는데, 이런 프레임단위에서 게임의 중요데이터(유료재화 등)의 관리는 어떻게 이루어 지나요? 보통 서버에서 중요데이터를 저장하는 부분은 이해하지만 실시간으로 데이터가 변하는 게임플레이 상황에 서버에 데이터를 저장하고 그걸 다시 불러오고를 프레임 단위로 반복하는건가요?. 만약 그렇다면 부하가 많이 걸리고 게임 퍼포먼스에 있어서도 선호되는 방식은 아닐 것 같습니다. 서버-클라이언트 방식의 연결방식은 이해하고 있지만, 위의 의문에 있어서 어떤 실시간 동기화인지 아니면 다른 방식인지 궁금합니다.
@wergia
@wergia 3 жыл бұрын
유료 재화만큼 중요한 데이터의 경우에는 유저 클래스의 변수를 데이터를 담아두는 그릇이라기 보다는 유저에게 그 재화를 얼마나 가지고 있는지 보여주는 디스플레이로 보시는게 좋을 것 같습니다. 유료 재화 같은 중요한 데이터의 경우로 사용자가 가지고 있는 유료 재화 사용한다고 했을 때 1. 사용자가 유료 재화 사용 동작 2. 사용자의 동작 명령이 서버로 전송 3. 서버가 가지고 있는 사용자가 가진 재화 양으로 동작 처리가 가능한지 검사 4. 재화 사용 처리 5. 재화 사용 결과를 서버에서 클라이언트로 반환 6. 남은 재화량을 유저 클래스에 업데이트하고 UI에 디스플레이 같은 형식으로 대기하게 설계하기 때문에 프레임 단위의 퍼포먼스 문제는 걱정할 이유가 없죠. 그리고 게임에서 서버를 이야기 할 때 명확하게 구분하셔야하는 점이 있습니다. 바로 로그인/유료 재화 결제 등을 처리하는 서버와 게임을 플레이하면서 캐릭터의 좌표 공격 등을 동기화하는 인 게임 서버입니다. 이 두 서버는 일반적인 게임에서 대부분 명확히 구분되어 있습니다. 그리고 로그인/유료 재화 결제 등을 처리하는 서버는 보통 웹 서버로 구축되어서 request-response 구조로 클라이언트가 요청하면 서버가 요청을 처리해서 응답하는 구조로 동작하기 때문에 프레임 단위 처리는 거의 이루어지지 않습니다. 그리고 실제 게임 내부에서 캐릭터의 좌표, 공격 등을 동기화하는 인 게임 서버에서 프레임 단위 동기화를 처리하죠.
@susi2622
@susi2622 3 жыл бұрын
@@wergia 중요한 개념정리 정말 감사드립니다!! 아직 제가 부족한 부분이 너무 많아 구글의 늪으로 빠져보겠습니다. 부족한 초보자에게 도움을 주셔서 다시 한번 감사드립니다! 그럼 전 싱글톤 영상 다시 시청하러 가보겠습니다👨‍💻
@hwangseung987
@hwangseung987 2 жыл бұрын
안녕하세요 베르님 질문이 있어서 댓글 남깁니다. 혹시 강좌에서 이동까지 구현하셨는데 도착지점까지 걸리는 시간 을 개산하는 방법이 있을까요? 초보라 질문 양해 부탁드립니다^^;
@wergia
@wergia 2 жыл бұрын
유니티 내비메시 기능에서 이동 경로의 각 포인트를 가져올 수 있는 기능이 있습니다. 그 기능을 이용해서 이동 경로 길이를 구하고, 캐릭터의 이동 속도로 길이를 나눠주면 이동 시간을 구할 수 있습니다.
@hwangseung987
@hwangseung987 2 жыл бұрын
@@wergia 넵 삽질하면서 찾아보니 웨이포인트를 가져올 수있고 각 포인트의 길이의 합을 구해서 총길이를 구했네요. 체크해보니 가속도 때문에 정확한 시간을 구해지진 않네요~ 그래도 근접한 시간 까지는 구해졌어요. 답글 감사합니다. 영상 잘 보고 있습니다.^^
@rocu9688
@rocu9688 3 жыл бұрын
Rigidbody가 없어도 NavMeshAgent가 작동을 하는데 Rigidbody를 써야하는 이유가 있는지 궁금합니다.
@wergia
@wergia 3 жыл бұрын
제가 늘 캐릭터 구현할 때 사용하는 버릇이라 그렇습니다. 우선 캐릭터는 상대방의 공격을 감지하는 콜라이더와 Rigidbody가 있어야 하기 때문에 추가해두는건데 내비메시 부분만 다룰 때는 필요가 없을 수도 있겠네요.
@user-yq7ot5mv3l
@user-yq7ot5mv3l 2 жыл бұрын
그냥 트랜스폼 이용해서 이동할 때는 바로바로 깔끔하게 이동했었는데 네비게이션 사용하니까 좀 답답하게 이동하네요.. 회전도 지맘대루 느릿느릿 하고요 마우스로 빨리빨리 급격하게 회전해도 즉각적으로 반응하게 만들 수는 없을까요?
@wergia
@wergia 2 жыл бұрын
NavMeshAgent에서 회전 속도 등 프로퍼티를 조정해보시면 됩니다.
@user-ms7ug1rn6v
@user-ms7ug1rn6v 3 жыл бұрын
몬스터와 캐릭터의 Distance가 5보다 낮을 때 SetDestination()했는데 몬스터가 캐릭터를 계속해서 밀어냅니다. 몬스터가 캐릭터 근처에서 서게 하고싶은데 if(Dis
@wergia
@wergia 3 жыл бұрын
캐릭터가 일정거리 근처에서 멈추게 하고 싶으시면 따로 코드를 작성할 필요없이 NavMeshAgent의 Stopping Distance 값을 조절하시면 됩니다.
@user-ms7ug1rn6v
@user-ms7ug1rn6v 3 жыл бұрын
@@wergia 감사합니다! 해결했습니다!
@tommylee4645
@tommylee4645 3 жыл бұрын
안녕하세요 강의 너무 감사드립니다. 두 갈래 길에서 Target까지 더 가까운 길에는 우선순위가 동일한 Agent가 서있고 나머지 길에는 아무것도 없는 상황에서 Agent가 당연히 아무것도 없는 길을 선택할 줄 알았는데 가까운 길을 선택하고 우선순위가 동일한 Agent를 밀고가더라구요.. 애초에 pathfinding할때 Agent가 있는 길이면 다른 길로 선택해서 가게끔 할 수 없을까요..?
@wergia
@wergia 3 жыл бұрын
내비메시 옵션만으로는 조금 어렵고 기능을 구현해야 할 듯 합니다.
@tommylee4645
@tommylee4645 3 жыл бұрын
@@wergia 답변 감사합니다!
@tommylee4645
@tommylee4645 3 жыл бұрын
@@wergia 안녕하세요 베르님 항상 영살 잘 보고있습니다. 다름이 아니라 navmesh쪽 개발중에 궁금한 사항이 생겨서요.. agent가 Set.Destination 함수를 실행시켜서 목적지로 향하는 도중에 특정 위치(좌표)를 지나간다면 어떠한 이벤트나 동작 액션을 주고 싶은데요.. Set.Destination로 가는 도중에 특정 위치(좌표)를 확인 할 수 있는 방법이 있을까요?
@wergia
@wergia 3 жыл бұрын
@@tommylee4645 해당 특정 위치에 트리거 콜라이더를 배치해서 캐릭터에 신호를 주는 방법이 있습니다.
@tommylee4645
@tommylee4645 3 жыл бұрын
@@wergia 안녕하세요 베르님! 다름이아니라 지메일 한번만 확인해 주실 수 있으실까요ㅜㅜ
@Kill_John
@Kill_John 3 жыл бұрын
안녕하세요. 질문이 하나 있는데 몇개월간 해결하지 못해서 이렇게 질문을 합니다. 항상 영상으로 도움 받고 있기도 하고, 그냥 질문하기 모해서 개발단에 가입하고 질문 드립니다. 간단한 게임을 구현 중인데요. 짧은 기획 내용은 0. 스타크래프트의 마린 키우기의 뷰 및 컨트롤 방식 0. 이동 지점 마우스 클릭 및 네비게이션으로 자동 길찾기로 이동 구현 중 1. 플레이어는 맵에 장애물을 설치 할 수 있음. 설치 된 장애물은 플레이어가 피해 이동 가능 (장애물에는 NavMeshObstacle / carve로 구현중 ) 2. 적(좀비)은 장애물을 피하지 않고 이동하여 장애물에 부딪하기
@Kill_John
@Kill_John 3 жыл бұрын
이거 유니티 네비게이션으로는 안될꺼 같아서...에셋 A* Pathfinding Project Pro을 구매 할까 하는데 이 에셋도 에이전트별 Obstacle설정을 따로 할 수 없나보네요 ㅠㅠ
@wergia
@wergia 3 жыл бұрын
개발단 가입을 환영합니다! 플레이어는 장애물을 피하고 좀비는 장애물에 그냥 부딪히는 기능 구현하고 싶으신 거군요! 자세한 방법은 저도 고민을 좀 해봐야겠지만 우선 런타임중에 내비 메시를 다시 굽는 방법이 있을 것 같습니다. 그래서 장애물이 생성되는 순간에 그 위치를 좀비는 갈 수 있는 영역이지만 플레이어는 가지 못하는 영역으로 바꿔서 내비 메시를 새로 구워버리는 겁니다. 그러면 플레이어는 그 영역을 피할거고 좀비는 그 영역으로 이동하려고 할겁니다. 대신 좀비가 장애물 영역을 이동할 때는 이동하려고 하지만 사실은 이동하지 못하게 만드는 코드를 구현하거나 데미지를 입히는 코드를 구현하면 될 것 같습니다. 이 아이디어가 도움이 될 지는 모르겠네요 ㅜㅜ 우선 저도 실시간 내비 메시 생성에 대해서 연구해봐야겠어요!
@user-hb4pl2ju3c
@user-hb4pl2ju3c 2 жыл бұрын
Target를 여러곳을 하고 가장 가까운 target을 찾는 방법을 알고싶습니다
@wergia
@wergia 2 жыл бұрын
각 타깃으로 향하는 가상의 움직이지 않는 에이전트를 여러 개 만들고 각 에이전트에서 agent.path로 경로를 가져온 다음 각 경로의 길이를 비교하시면 될 것 같습니다.
[Unity/Basic] Animation Event
11:06
베르의 게임 개발 유튜브
Рет қаралды 10 М.
내비게이션 시스템 1 - NavMesh | 유니티
10:05
베르의 게임 개발 유튜브
Рет қаралды 14 М.
Задержи дыхание дольше всех!
00:42
Аришнев
Рет қаралды 3,6 МЛН
Получилось у Миланы?😂
00:13
ХАБИБ
Рет қаралды 4 МЛН
[Unity/MiddleClass] Scriptable Object
9:02
베르의 게임 개발 유튜브
Рет қаралды 18 М.
오픈소스 LLM으로 RAG 시스템 만들기
26:24
모두의AI
Рет қаралды 32 М.
유니티 JSON 저장과 불러오기 ! (Save and load tutorial using Unity JSON)
25:30
NK Studio의 유니티 스페셜 테크닉
Рет қаралды 12 М.
오브젝트 풀링 구현하기 | 유니티
14:50
베르의 게임 개발 유튜브
Рет қаралды 15 М.
[Unity/MiddleClass] Make a function to move the character to the clicked position
13:09
베르의 게임 개발 유튜브
Рет қаралды 14 М.
Groundbreaking New Solar Energy System - Too Good to be True?
7:07
Sabine Hossenfelder
Рет қаралды 422 М.
UI 비법서 - 버튼의 모든 것 | 유니티
11:28
베르의 게임 개발 유튜브
Рет қаралды 28 М.
스트리밍 레벨 기능 구현하기 | 유니티
9:15
베르의 게임 개발 유튜브
Рет қаралды 7 М.
Developers Compete To Create The Worst UIs
11:10
노마드 코더 Nomad Coders
Рет қаралды 80 М.
Задержи дыхание дольше всех!
00:42
Аришнев
Рет қаралды 3,6 МЛН