오프 스크린 AI를 처리하는 좋은 방법?


16

예를 들어 술 :

  • 세계에 10 개의 방이 있다고 가정 해 봅시다.
  • 그리고 세계가 10 개의 독립 체에 의해 거주한다고 가정 해 봅시다.
  • 또한 각 엔티티에는 자체 "일상 루틴"이있어 회의실에서 특정 작업을 수행하고 회의실 간에도 이동할 수 있습니다.

플레이어가 한 번에 한 방에만있을 수 있다는 점을 고려할 때 다른 실체가 다른 방에서 수행하는 작업을 화면 밖에서 추적하는 좋은 방법은 무엇입니까?

  1. 가장 간단한 옵션은 모든 프레임에서 10 개의 엔티티 각각을 확인하고, 위치 / 상태를 확인하고, 플레이어가 언제든 플레이어가있는 방에 있어야하는지 여부를 결정하는 것입니다. (그러나 객실 / 엔터티 양이 증가하면 특히 리소스가 많이 사용됩니다.)
  2. 또 다른 옵션은 게임 시작 후 경과 한 시간을 추적하는 것입니다. 각 엔티티는 패턴이 플레이어가있는 방과 교차하는지 여부를 확인하고 그렇지 않은 경우 시간과 비교하여 확인합니다. 실체는이 특정 시간에 같은 방에 있어야하는데, 패턴이 플레이어가있는 현재 실과 교차하지 않는 실체는 플레이어가 자신의 패턴이 교차하는 실에 들어가기 전까지는 아무 것도하지 않습니다. 렌더링해야합니다. (그러나 그들이 방과 상호 작용한다면, 그 시점에서 그들의 위치를 ​​결정하기 위해 경로와 교차하는 방의 상태를 항상 확인해야 할 것입니다.)

  3. 세 번째 옵션은 우선 플레이어 위치와 교차하는 경로를보고 (앞서 설명한대로) 두 번째로 방에 들어갔을 때 플레이어가 그 방에 있는지 확인하십시오. 방의 상태와 다음 방으로 진행하는 데 얼마나 걸립니까? 예를 들어, 관리인 NPC가 회의실에 입장하고, 회의실 상태를 확인하고, 플레이어가 흘린 유출이 있는지 확인하고, 청소하는 데 걸리는 시간과 경로가 걸리는 시간 등을 계산합니다. 시간은 다음 방에 들어가기 때문에 플레이어가 방에 있는지 확인합니다. 렌더링 목적으로 NPC의 정확한 위치는 플레이어가 방에 들어올 때만 계산됩니다.

잠시 동안 브레인 스토밍을 한 후 세 번째 옵션을 사용했지만 이러한 것들을 처리하는 알려진 방법이나 더 좋은 방법이 있는지 궁금합니다.


1
이 질문은 Project Zomboid라는 게임에 대해 읽은 개발자 블로그를 상기시킵니다 .
Sumurai8

답변:


12

매우 간단한 방법은 "AI Level of Detail"을 사용하는 것입니다. 대략 이것은 AI가 플레이어 / 카메라에 가까이있을수록 AI를 더 자주 업데이트한다는 것을 의미합니다. 더 멀리있는 AI 계산의 복잡성을 줄일 수도 있습니다. 경로 찾기를 위해. 결국, 플레이어가 캐릭터를 잘 볼 수 없거나 전혀 볼 수 없다면, 캐릭터를 최고 정확도로 시뮬레이션하는 데 많은 노력을 기울일 필요가 없습니다.

귀하의 예에서, 플레이어가있는 방은 가장 높은 정확도를 얻을 수 있습니다 (AI는 모든 프레임, 전체 해상도 업데이트). 인접한 방은 다음으로 높은 정확도를 얻을 수 있습니다 (10 틱마다 업데이트, 경로 스무딩 및 애니메이션 제거). 다른 모든 방은 가장 낮은 정확도를 얻을 수 있습니다 (매초마다 업데이트, 저해상도 경로 찾기, 필수적이지 않은 NPC 대 NPC 상호 작용 제거).

더 크고 복잡한 게임은 비슷한 접근법을 사용할 수 있습니다. 전투 계산을 단순화하고 이동해야 할 때 경로를 찾는 대신 문자를 텔레포트 할 수 있습니다.

게임이 항상 메모리에 모든 것을 보관할 수 없을 정도로 큰 경우, 좋은 해결책은 방의 저장된 데이터에 마지막 업데이트 시간을 저장하고 가장 낮은 해상도에서 시뮬레이션을 화면 밖에서 (최저 해상도로) 재생하는 것입니다 다시로드되었습니다.

일정에 따라 AI가 언로드 된 "수면"영역에서 "실제"영역으로 이동할 것으로 예상되는 경우 해당 영역이 항상 메모리에 보관할 수 있도록 초저 충실도 데이터를 생성해야합니다 (예 : 가장 거친 것) navmesh 세부 수준 및 주요 개체 / 캐릭터 위치) 또는 주기적으로 해당 영역을 순환 시키려고합니다 (예 : 자주 업데이트되지 않는 메모리 및 시뮬레이션에서 X "자기"영역을 낮은 충실도로 유지 한 다음 " 잠들기 "영역에 주요 활성 NPC가 있고, 언로드 및로드 영역).


1

현재 해당 실 인스턴스의 실에있는 실체를 저장하려고합니다. 실 개체는 언제 어떤 실체를 업데이트 해야하는지 추적합니다 (예 : 다른 실로 이동하거나 그 실에서 무언가 변경 등). 그리고 매초 하나 이상의 방을 업데이트 할 것입니다 (다른 스레드에있을 수도 있음).

회의실을 업데이트 할 때 NPC 위치를 업데이트하고 마지막 업데이트 이후 룸과 상호 작용하는 모든 작업을 처리해야하며 마지막으로 필요한 업데이트 시간을 확인 / 업데이트 해야합니다.

엔터티가 한 방에서 다른 방으로 이동하는 경우 인스턴스가 다른 방에 저장되고 다음 번 업데이트도 업데이트 되어야합니다.

이렇게하면 현재 방과 그 순간에 예정된 업데이트가있는 방만 계속 업데이트해야하며 다른 방을 업데이트하는 것은 선택 사항입니다 (하지만 플레이어가 움직일 때마다 업데이트하는 AI가있는 경우 권장) .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.