유닛의 적 "인식"을 어떻게 구현해야합니까?


12

RTS / TD 하이브리드 프로토 타입 게임을 개발하기 위해 Unity3d를 사용하고 있습니다. 유닛과 적 사이의 "인식"을위한 최선의 방법은 무엇입니까? 모든 유닛이 모든 적과의 거리를 확인하고 사거리 내에 있으면 교전하는 것이 제정신입니까?

지금 당장 접근하는 방법은 모든 장치에 방아쇠를 설치하는 것입니다. 적이 방아쇠에 들어가면 유닛은 적을 인식하고 거리 확인을 시작합니다. 이것은 불필요한 점검을 저장합니까?

가장 좋은 방법은 무엇입니까?


단위 / 적 수는 최고 사령관의 규모가 될 것이라고 덧붙여 야합니다
Phil

답변:


10

BVH (Bounding Volume Hierarchies)를 살펴보십시오. 충돌을 계산할 때 또는 객체에서 절두체 컬링을 수행하기 위해 렌더링 할 때 필요한 검사 수를 줄이기 위해 충돌 감지에 가장 일반적으로 사용됩니다. 이미 구체를 사용하고 있으므로 AABB와 같은 다른 볼륨이 더 효율적일 수 있지만 구체 트리를 제안합니다 . 내가 사용한 적이없는 것과 같은 Unity에 대해 어떤 종류의 지원이 있는지 확실하지 않지만 충돌 감지 또는 엔진의 렌더링 부분에는 이미이 기능이 있습니다.

기본적으로 서로 가까이있는 적을 여러 부모 구체로 그룹화하려고합니다. 유닛이 움직일 때, 각 적을 확인하는 대신, 모구에 대해 트리거 영역을 확인합니다. 방아쇠 구체가 부모 구체와 교차하면 내부의 각 적을 확인합니다. 그렇지 않다면 그 안에있는 모든 적을 버릴 수 있습니다. 각 구의 최대 구 크기 또는 적 수를 기준으로 여러 수준의 구를 설정하고 최상위 구를 기준으로 확인을 수행하려고합니다. 그런 다음, 각각의 거리 점검을 수행 할 필요없이 각각의 적을 점검하기 위해 나무를 걸어가는 것입니다.

각 프레임에 필요한 단계 :

  1. 적을 이동
  2. 새로운 적 위치에 대한 BVH 재건 / 업데이트
  3. 단위를 이동하고 구체 트리를 확인하십시오.

이것은 적들이 많을 때 필요한 수표를 줄일 수 있지만, 그 수가 많지 않으면 트리를 업데이트하고 저장하는 오버 헤드는 그만한 가치가 없을 수 있습니다. 나는 당신이 무엇을하는지 알기 위해 최고 사령관에 익숙하지 않습니다. 그래서 나는 단지 '수백'을 가정하고 있습니다. 오버 헤드가 가치가 있는지 여부를 알아 보려면 다양한 상황에서 프로파일 링해야합니다.


3
+1이 방법은 약간의 오류가 있지만 가장 간단합니다. OP는 이것을 구현 한 다음 octree와 같은 것을 구현할 수 있습니다. 또한 대부분의 RTS에서 장치는 약간의 지연으로 반응합니다. 실제로 게임의 대부분의 AI는 초당 10-30 프레임으로 계산되며 여기서 게임은 초당 30-60 프레임으로 실행될 수 있습니다 (물론 근사치입니다).
Samaursa

감사합니다. 이것이 한 단계 더 나아 가기 위해 필요한 것입니다. BVH를 찾아서 Unity에서 구현하는 방법을 알아 보겠습니다. 매우 교육적이고 유익한 게시물! +1
Phil

오, 그리고 RTS에 있다면 최고 사령관을 확인하십시오. 모든 Chris Taylor 게임과 마찬가지로 정말 멋진 게임입니다.
Phil

7

Unity의 충돌 엔진은 본질적으로 이미이를 위해 BVH를 구현할 필요가 없습니다.

각 유닛 (범위를 나타내는)에 큰 경계-스피어 트리거를 부착하고 각 유닛 의 범위 내에있는 적을 추적하기 위해 OnCollisionEnter()OnCollisionExit()콜백을 처리하기 만하면 됩니다.

관심있는 경우는 다른 단위의 구가 구와 충돌 할 때가 아니라 다른 단위가 구와 충돌 할 때입니다.


1
나는 이것이 적어도 받아 들여진 대답 바로 위로 올라 가야한다고 생각합니다. 허용되는 답변은 공부하기에 좋지만 이것이 가장 실용적인 방법이므로 맨 위에 있어야합니다.
Varaquilex

난 당신 말은 생각 OnTriggerEnter()하고 OnTriggerExit(), 권리를?
Jibb Smart

1

확장 성이 뛰어나고 다른 많은 것들에 사용될 수있는 또 다른 솔루션은 인플 루 언스 맵입니다. X 반경 내에서 스캔 할 장치 주위에 그리드 타일 세트를 생성합니다. 이 타일을 스캔하여 적들 중 하나에 서 있는지 확인하십시오. 가장 가까운 적을 얻으려면 거리별로 세트를 정렬 할 수 있습니다.

이것은 특히 안개 나 전쟁과 같은 영향 맵으로 다른 일을하려는 경우 가장 효율적인 방법 일 수 있습니다.

https://www.youtube.com/watch?v=MEd6XV2Pecw 개념을 설명하는 비디오가 있습니다 .

다음은 구현입니다. https://www.youtube.com/watch?v=y_ewoxlZlgc

시작시 그리드 타일의 유닛 컬렉션을 초기화하지 말고 컬렉션이 필요할 때만 초기화하는 것이 좋습니다.

또는 타일에 X 단위를 초과하지 않는 경우 X 길이 배열을 사용할 수 있습니다.

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