엔터티 시스템에서 충돌 감지 및 응답


12

ES로 더 재미있게 ...

현재 몇 가지 시스템이 있습니다.

  • 렌더러 (렌더링 가능 속성, 변환 속성)
  • 모션 (이동 가능 속성, 변형 속성, 렌더링 가능 속성 [경계 상자 등])
  • 입력 (InputReceiver 속성)
  • 기타

충돌 감지를 추가하고 있습니다. 저의 첫 생각은 충돌을 수행하는 새로운 시스템을 추가하는 것이 었습니다. 그것은에서 고립이 계속 나에게 의미가 Motion모든 것들 때문에 그 움직임을 시스템 또는 충돌 감지에 참여할 필요는 애니메이션되는 - 등 카메라, 안개, -하지만 보인다 CollisionMotion상호 의존적이다.

경우 Motion엔티티는 변환 요구가 이동하여 검증하는 Collision, 상기 이동 중 취소 또는 조정 (등 벽에서 정지 튀는).

대안은 충돌 객체 (kd-tree, octree 등)에 대한 참조를 유지하는 Collidable 속성을 만드는 것입니다. 서로 충돌 할 수있는 엔티티간에 공유됩니다. Motion시스템은 그 특성에 대해 확인하고 확인하거나 움직임을 조정하는 데 사용할 수 있습니다.

코드 관점에서 볼 때 이는 수용 가능한 솔루션입니다. 그러나 ECS 아키텍처 관점 Motion에서는 Movable특성 이있는 모든 엔터티에 적용되지 않는 논리를 시스템에 적용하는 것 같습니다.

나는 또한의 움직임 벡터를 저장할 수 Movable속성, 그리고이 Collider시스템은 조정 Transform필요하지만, 그 사이에 기능을 중복 포함됩니다 MotionCollider, 또는에서 콜백 ColliderMotion바운스 / 반사 등의 충돌 위치와 표면 데이터에 대한 몇 가지 데이터 .

이것은 "특별 사례 해킹"이라는 제목에 속할 수 있지만 많은 양의 에지 케이스 코드를 만들지 않고이를 처리 한 사람들로부터 입력을 받고 싶습니다.

질문 서로에 대한 지식이 필요할 때 모션 시스템과 충돌 시스템 사이의 긴밀한 연결을 피하는 좋은 방법은 무엇입니까?


1
질문이 무엇입니까?
jcora

@ 충돌 감지 로직을 배치하고 충돌 + 이동을 가능한 한 개별적으로 유지하며 시스템 간 상호 종속성을 최소화하는 데 적합한 장소를 구하십시오. 내 게시물은 약간의
충격이었다

1
좋아요, 이제 질문에 굵게 표시하십시오 . :)
jcora

답변:


7

당신은 그것을 너무 생각하고 있습니다. 엔터티 구성 요소 시스템을 사용하는 엔진에서는 GameObject누구나에 대한 포인터를 가질 수 있습니다 ModuleCollision.

게임이 업데이트되면 어떻게됩니까?

  • Scene은 보유하고있는 모든 객체를 업데이트합니다. Update각 함수를 호출합니다 GameObject.
  • 내부 Update기능, 각 GameObject 단지 의 속도와 방향, 업데이트 하지 위치를.
  • GameObjectModuleCollision사용 가능한 경우 현재 위치, 속도 및 방향을에 업로드 합니다.
  • 장면은 기본적으로 충돌 검사를 수행 ModuleCollision합니다.
  • 장면은 UpdatePost각각 의 함수를 호출합니다 GameObject. 객체에 충돌 모듈이 있으면 충돌 모듈에서 업데이트 된 위치, 속도 및 방향을 가져옵니다. 위치는 속도와 방향으로 업데이트됩니다.
  • GameObject구성은 위치와 방향에서 최종 3x3 행렬을 구성합니다.

예, 국가의 중복이 있지만 괜찮습니다. 충돌 처리를 수행하는 ModuleCollision것이 가장 좋은 방법입니다. 그렇지 않으면 핸들 GameObject이 있는지 확인해야합니다 ModuleCollision.


2
충돌의 경우 역 추적 위치가 걱정되지 않고 변환에서 속도 / 가속을 분할하여 감지 된 충돌을 기반으로 속도를 변경 한 다음 변경 사항이 동일한 프레임 내에서 두 번째 특수 업데이트로 전파됩니까? 꽤 깨끗해 보입니다. 감사.
3Dave

3

나는 이것을 이렇게 할 것입니다 ...

세 가지 시스템이 있습니다 :

  1. 운동 시스템
  2. 가속 시스템
  3. 충돌 시스템

이동 시스템은 속도를 위치에 적용합니다. 가속 시스템은 속도에 힘을가합니다. 충돌 시스템은 충돌을 감지하고 올바른 방향으로 힘을 적용하거나 원유 충돌을 원하는 경우 속도를 직접 변경합니다.

예를 들어 atan2를 사용하여 충돌 사이의 각도를 계산 한 다음이를 사용하여 바디에 올바른 힘 / 속도를 적용 할 수 있습니다.

필요한 경우 충돌 감지 시스템이 메시지를 브로드 캐스트하도록하십시오.

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