컴포넌트 / 엔터티 기반 디자인 + 동작 트리 => 통합 방법?


9

현재 프로젝트를 위해 기본적으로 구성 요소 / 엔티티 기반 시스템을 구현했습니다 . 기본적으로 대부분의 모범 사례에 따라이 정의되지 않은 영역에 있습니다 .

그래서 기본적으로 ID, 사람이 읽을 수있는 이름, 구성 요소 및 구성 요소가 무엇인지 나타내는 데 사용되는 "유형 표시기"인 (약간 확장 된) 엔티티를 얻었습니다 ( 모든 구성 요소에 대해 2의 거듭 제곱이 있습니다) 유형과 구성 요소가 엔티티에 추가 될 때마다 비트 단위 연산을 통해 해당 길이를 자동으로 변경 하고이 답변을 비교 하십시오 ).intstd::maplongenum

그런 다음 거기에 구성 요소 도 비교적 간단 : intID, enum구성 요소 유형, 부모 엔티티 포인터와 같은 std::map이 구성 요소가 보유하고있는 모든 속성.

마지막으로 실제 논리 처리를 처리하는 일부 시스템 / 관리자 . 먼저 현재 처리 된 엔터티에 일치하는 long"유형 표시기" 가 있는지 확인합니다. = 해당 시스템에 필요한 모든 구성 요소가 있는지 확인합니다. 그런 다음 필요한 경우 일부 속성에 액세스하고 해당 구성 요소의 일부 함수를 직접 호출하거나 메시지 발송자를 통해 일부 메시지를 보냅니다.

결론 : 지금까지 데이터 중심 방식과 결합 된 다소 표준적인 이벤트 중심 컴포넌트 / 엔티티 기반 시스템 (컴포넌트에는 하드 코딩 된 데이터 변수가 없지만 대신 (일부) 컴포넌트로 일반 맵이 있음) 구성 요소의 / archetypes는 나중에 실제 구성 요소 코드의 일부가 아닌 추가 데이터를 추가 할 수있는 옵션으로 파일에서 읽습니다.

이제 그 프로젝트 에 Behavior Trees ( AiGameDev BTSK 기반)를 소개 하고 싶지만 , 기존 컴포넌트와 어떻게 연결해야하는지, 그리고 이러한 디자인을 일반적으로 통합하는 방법은 확실하지 않습니다.

몇 가지 관련 아이디어 / 포인트 / 질문이 떠 오릅니다.

  1. 내 BT를 파일에서 다시 읽습니다. 나는 현재 BT Action그 트리의 인과 내 응용 프로그램의 실제 코딩 사이의 연결을 가장 잘 만드는 방법을 보는 데 어려움을 겪고 있습니다. BT 파일에 사용 된 동작 이름과 실제 논리 구현에 대한 함수 포인터 사이에 일종의 맵을 작성해야합니까? 이를 해결하기위한 일반적인 접근 방법은 무엇입니까?

  2. 필자는 모든 다른 Entity유형에 대해 BT를 만들어야한다고 가정합니다 (따라서 여러 번 언급 한 긴 "유형 표시기"로 표시되는 각 게임 논리 / AI 관련 구성 요소 조합에 대해). 결과적으로 BT Action액션 당 많은 구성 요소가 관련 될 가능성이 높 으므로 구성 요소에 구현 을 적용하는 것이 합리적 이지 않습니까?

  3. 그렇다면 BT Action논리는 여러 개별 시스템에 있어야 합니까 (아이디어 # 1의지도가 가리키는 방법)? 시스템은 BT가 현재 점검되고 특정 조치를 실행하도록 지시받은 (= 시스템의 방법) 실제로 수행 할 수 있는지 (= 필요한 구성 요소가 long있는지) 내 "유형 표시기"에 따라 Entity점검합니다. 그러나 BT 제작자가 특정 상황을 간과했기 때문에 필요한 구성 요소가 더 이상 런타임에 엔티티에 연결되지 않을 수 있기 때문에 아무 일도 일어나지 않습니다.

질문 :

  • 이러한 종류의 통합에 대한 입증 된 개념이 있습니까?
  • 위의 3 점을 어떻게 받습니까?
  • 구성 요소 / 엔티티 기반 디자인과 관련하여 염두에 두어야 할 다른 사항이 있습니까?

요점 1 : 비헤이비어 트리는 주로 캐릭터 행동을 만드는 데 사용되는 시각적 DSL에 지나지 않습니다. BehaviorTree 구성 요소는 스크립트 구성 요소보다 더 많거나 적은 작업을 수행해서는 안됩니다. 요점 3 : 일반 필드에서지도를 사용하는 이유는 무엇입니까?
Eric

# 1 :이 문맥에서 "DSL"은 무엇을 의미합니까? # 3 : 미안하지만 이걸 따라갈 수는 없습니다. 무슨 뜻인지 설명해 주시겠습니까?
Philip Allgaier

1
아마도 도메인 특정 언어, 즉 매우 특정한 문제를 해결하기위한 커스텀 문법.
Patrick Hughes

패트릭은 의미론도 그 일부이며 "매우"가이 정의에서 제외 될 수는 있지만 정확합니다. -Re 3 : 사과합니다. " 구성 요소의 일반 필드 맵을 사용하는 이유는 무엇입니까 ?"
Eric

Re 3 : 나중에 C ++ 코드 외부에서 추가 속성을 동적으로 지정할 수있는 기능 (버즈 워드 : 데이터 기반)을 원합니다. 간단하게하기 위해 (현재는 적어도) 현재 코드를 수정하여 실제 C ++ 필드가 될 수있는 모든 속성을이 일반 프레임 워크 (맵 사용)에 넣습니다. 성능 문제가되면 나중에 다시 방문해야 할 수도 있습니다.
Philip Allgaier

답변:


2

그러나 현재 해당 트리의 BT 작업과 내 응용 프로그램의 실제 코딩을 어떻게 연결하는 것이 가장 좋은지 알기가 어렵습니다. BT 파일에 사용 된 동작 이름과 실제 논리 구현에 대한 함수 포인터 사이에 일종의 맵을 작성해야합니까? 이를 해결하기위한 일반적인 접근 방법은 무엇입니까?

함수 포인터를 잊고 객체에 대해 생각하십시오. 행동 트리의 각 노드 (이 시점부터 BT)는 코드에서 하나의 객체에 이상적으로 해당합니다. 이러한 객체에는 트리로 정렬하고 트래버스 할 수있는 표준 인터페이스가 있습니다. 함수 포인터 세트는 동작에 적합하지만 트리의 구조를 전혀 캡처하지는 않습니다.

결과적으로 동작 당 많은 구성 요소가 관련 될 가능성이 높으므로 구성 요소에 BT 조치 구현을 배치하는 것은 이치에 맞지 않습니까?

엔터티에는 해당 엔터티의 BT에 대한 관련 데이터를 저장하는 단일 BehaviorTree 구성 요소가 있어야합니다. BT의 실행은 시스템의 구성 요소를 처리하는 방법에 따라 BT 구성 요소 또는 BT 하위 시스템에 의해 수행됩니다. 구성 요소를 사용하는 거의 모든 것과 마찬가지로 작업을 수행하기 위해 다른 구성 요소를 참조해야하지만 다른 구성 요소는 BT에 대해 아무것도 알 필요가 없습니다.

사용 가능한 다른 조치는 가장 단순한 레벨에서 다양한 BT 노드 오브젝트로 인코딩됩니다. 예를 들어 필요에 따라 컴포넌트를 조작하여 관련 엔티티를 작동시킬 수 있어야합니다. 이동 컴포넌트에 액세스하여 이동합니다.


단락 # 1 : 예, BT 자체는 객체가됩니다 (AiGameDev의 버전처럼 말했듯이). 방금 행동 자체에 대한 펑터에 대해 생각하고 있었지만 단락 2가 변경되었습니다. 어떤 이유로 든이 간단한 접근 방식은 나에게 결코 발생하지 않았습니다 (자체 BT 멤버 인스턴스가있는 엔티티). 완전히 새로운 구성 요소로 인해 더 이상 똑바로 생각하지 않았으므로 BT와 구성 요소를 혼합하는 방법을 찾고 있었지만 실제로는 필요하지 않습니다.
Philip Allgaier

내가 이전에 잃어버린 가장 중요한 것은 작업을 엔터티와 연결하는 방법이었습니다. 이제는 명확합니다. 액션은 트리를 통해 어떤 엔터티를 소유하고 있는지를 알고 있습니다.
Philip Allgaier

@Philip Allgaier 궁금합니다. 어떻게 BT 노드를 만들었습니까? 1 개의 행동 노드 = 1 개의 엔티티 (1 개의 게임 오브젝트 당 많은 엔티티가 될 것)로 생성했거나 노드를 일반 클래스 (ECS와 무관)로 생성하거나 다른 접근법을 사용 했습니까? 감사!
cppBeginner 4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.