작성
·
63
·
수정됨
0
3D MMO 중에서 소수점 단위로 이동하고 모든 방향을 바라볼 수 있는 게임은 스킬 판정을 어떻게 하면 좋을까요?
어려운 점은 모든 방향을 볼 수 있는 캐릭가 스킬을 사용하면 스킬 범위는 float 형태로 나와야 한다는 것 인데요.
기존 강의에서 배운 맵 좌표는 int로 관리할텐데, 3D 게임은 오브젝트 위치 정보를 float 형태로 관리하기 때문에 이 둘을 동기화 하는 방법을 떠올리는게 어려웠습니다.
루키스님 질의응답과 상상을 통해서 두 가지 방법을 생각해봤습니다.(맵에 높이는 없이 x, y 축만 생각하겠습니다.)
첫 번째 방법
서버의 맵은 2D 타일 맵(int 좌표)으로 관리하면서 캐릭터는 정밀한 위치(float 좌표)를 가지고 있어, 스킬 히트 판단 시 정밀 판단 로직을 추가한다.
아래 그림처럼 회색 캐릭터의 정확한 위치는 캐릭터가 가지고 있으며, 점유하고 있는 셀(분홍색 박스 4개)은 서버 맵에 저장합니다.
현재 서버 맵에 (0,0), (1,0), (0,1), (1,1)에는 회색 캐릭터가 (3,2)에는 빨간색 캐릭터가 있습니다.
빨간 캐릭터가 방사형 or 투사체를 발사했을 때 서버는 서버는 서버 맵에서 스킬 효과 범위에 들어갈 것 같은 예상 후보가 있는지 탐색합니다.
투사체가 닿는 범위인 (1,0), (2,0), (3,0), (2,1), (3,1) 을 대상으로 예상 후보 탐색
예상 후보 셀에 포함된 캐릭터가 있는지 확인하고 해당 캐릭터가 실제 효과 범위에 들어가는지 판단합니다.
(1,0) 셀에 회색 캐릭터가 있을 수 있으니 스킬 효과 범위 min < 캐릭터 중심점 기반 히트박스 < 스킬 효과 범위 max 인지 판단
두 번째 방법
캐릭터가 점유하는 셀을 더 작게 쪼개서 캐릭터 히트 박스나 조이스틱 처럼 살짝 이동할 수도 있고, 전방향 이동에 위화감이 없도록 구현
현업에서는 어떻게 구현하는지 궁금합니다!
답변 2
0
네 놀랍게도 3D 기반의 스킬을 완벽하게 구현한 MMO는 (제가 아는 한) 없습니다.
특히 무늬만 3D고 사실 2D 처럼 판정하는 경우가 많고요.
그리고 일반적인 구현 방법은,
말씀하신 첫 번째 방법과 매우 정확히 일치합니다.
다만 서버는 유니티/언리얼 처럼 충돌체Collider의 개념이 없어
스킬 판정을 수학적으로 직접 구현하는 경우가 많습니다.
굳이 3D 판정을 가야 한다면 그리드를 3D로 만들어서 (=Voxel)
동일하게 축을 추가해서 가면 되긴 하겠지만
MMO에서 공중전까지 가는 경우는 드물기 때문에 실제로 본 적은 없습니다.
말씀하신 두 번째 방법은 현실적으로 힘듭니다.
서버는 클라처럼 60프레임에 실행되는 개념이 아니라
미세한 판정을 하기 힘듭니다.
일부 게임에서 투사체를 날려 지형 지면에 닿으면 폭발하고!
누가 봐도 3D처럼 판별하는데. 놀랍게도 온갖 눈속임 + 트릭을 사용합니다.
예를 들어 클라에서 날린 투사체의 피격 판정을 클라에서 직접 판단해서,
서버에 충돌 사실을 알리고 서버에서는 아~주 러프한 검증만 하고
데미지 적용을 하는 경우도 있었습니다.
3D MMO라면 연산량이 안 되기 때문입니다.
MMO가 아닌 다른 장르라면 기획적 이슈도 있을 수 있고요.
오버워치 같은 FPS는 또 캐릭터 충돌이 있습니다.
리니지라이크 같은 칸 단위의 판정은 아주 단순하지만
(해당 칸에 누가 있는지 체크만 하면 됨)
3D 기반으로 가게 되면 서버가 감당 못할 정도로 정말 복잡해집니다.
애당초 주변에 누가 있는지조차 판별하기가 까다로워지겠죠.
0
안녕하세요, 인프런 AI 인턴입니다. 홍지범님께서 MMO 3D 게임에서 스킬 판정과 관련하여 질문 주셨군요. 3D 게임 개발에서 스킬 판정은 매우 중요한 부분이며, 특히 모든 방향을 고려한 정밀한 판정이 필요합니다.
질문하신 내용에서는 두 가지 방식을 제안하셨는데, 실제 현업에서는 이와 유사하거나 다른 방식이 사용될 수 있습니다. 관련된 질문들을 살펴본 결과, 이와 유사한 주제를 다룬 몇 가지 포럼에서 도움을 받을 수 있을 것 같습니다.
3D MMORPG에서 충돌체크 구현에 대하여 궁금합니다 - 이 게시물에서는 3D 데이터 관리 방식에 대해 설명하며, 셀 방식(cell)과 복셀(voxel) 방식을 언급하고 있습니다. 특히 복셀 방식은 3D 공간의 작은 단위 셀을 사용하여 충돌 및 판정을 할 수 있는 방법 중 하나입니다.
3D MMORPG 같은 경우 맵 관리를 어떻게 해야하나요? - 여기서는 3D 맵의 충돌 정보를 어떻게 클라이언트와 서버에서 관리할 수 있을지를 설명합니다. 이 게시물에서는 서버와 클라이언트의 싱크 문제를 줄이기 위한 방법론을 제시하고 있습니다.
Hit 판정 질문드립니다 - 이 게시물에서는 Hit 판정 및 충돌 처리를 다루고 있으며, MMO 게임에서의 서버 처리 방식을 논의하고 있습니다.
스킬 판정에 있어서는, 서버에서의 정확한 판정을 위해 캐릭터의 좌표와 스킬 범위를 float 타입으로 관리하는 것이 주로 사용됩니다. 이를 통해 클라이언트-서버 간의 싱크 문제를 줄이고 보다 정밀한 판정을 구현할 수 있습니다. 또한, 복셀 방식이나 공간을 작게 쪼개는 방식을 사용하면 더 섬세한 판정이 가능할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
상세한 답변 감사합니다.
게임 기술이 눈속임과 트릭이지만 사용자들이 3D 세계에 있다고 느낄 수 있는 기술과 노하우군요.
공부 할수록 너무 재밌는 분야네요. 파고들 요소도 많구요.
추가 질문 하나만 더 드립니다만, 3D 기반 게임에서 캐릭터간 충돌이 없는 이유는 불필요한 연산이라서 인가요?
3D MMO 뿐만이 아니라 3D 탑뷰 슈팅 게임(e.g. 브롤스타즈, 쿠키런 모험의 탑) 도 플레이어블 캐릭터 간 충돌은 없더라구요.
바람의 나라 같은 2D MMO는 캐릭터간 충돌이 있지만, 3D 기반은 충돌 판정을 안하는 이유가 있을까요?
제 상상으로는 M2 처럼 정수 셀에 캐릭터가 한 개만 배치할 수 있다면 충돌 판정을 넣으면 좋겠지만, 3D 게임처럼 float 형태 좌표일 경우 캐릭터 충돌 판정보다 더 중요한 연산(e.g. 스킬 판정) 이 더 많아서 굳이 없어도 게임에 문제가 생기지 않는 충돌 판정은 안쓰는게 아닐까 생각됩니다.