제목은 의도적으로 쌍곡 적이며 패턴에 대한 나의 경험이 아닐 수 있지만 여기에 내 추론이 있습니다.
엔터티를 구현하는 "일반적인"또는 논란의 여지가없는 방법은 그것들을 객체로 구현하고 일반적인 행동을 서브 클래 싱하는 것입니다. 의 고전적인 문제에 대한이 리드 "는 것입니다 EvilTree
의 서브 클래스 Tree
나 Enemy
?". 다중 상속을 허용하면 다이아몬드 문제가 발생합니다. 우리는 대신 결합의 기능 당길 수 Tree
와 Enemy
하나님 클래스에있는 리드 계층까지 더를, 또는 우리는 의도적으로 우리의 행동을 남길 수 있습니다 Tree
및 Entity
(가) 너무 (그들이 극단적 인 경우에 인터페이스 만들기) 클래스 EvilTree
에있는 리드를 - 그 자체를 구현할 수 있습니다 우리가 가진 코드 중복 SomewhatEvilTree
.
엔티티 컴포넌트 시스템은 분할하여이 문제를 해결하려고 Tree
하고 Enemy
다른 구성 요소에 객체를 - 말 Position
, Health
그리고 AI
같은 같은 시스템 및 구현 - AISystem
AI 결정에 따라 실재물의 위치를 변경 그. 지금까지는 좋지만 EvilTree
파워 업을 통해 피해를 입을 수 있다면 어떨까요? 먼저 a CollisionSystem
와 a 가 필요합니다 DamageSystem
. 다음 CollisionSystem
과 통신해야합니다 DamageSystem
. 두 가지가 충돌 할 때마다 CollisionSystem
메시지를 보내기 DamageSystem
때문에 상태를 뺄 수 있습니다. 파워 업에도 영향을 미치기 때문에 어딘가에 보관해야합니다. PowerupComponent
엔티티에 첨부 할 새 를 작성 합니까? 그러나 그때DamageSystem
아무 것도 모르는 것에 대해 알아야합니다. 결국 파워 업을받을 수없는 피해를 입히는 것들도 있습니다 (예 :) Spike
. 우리는 허용 함 PowerupSystem
수정 StatComponent
도 유사 피해 계산에 사용되는 이 답변을 ? 그러나 이제 두 시스템이 동일한 데이터에 액세스합니다. 게임이 복잡 해짐에 따라 여러 시스템에서 구성 요소를 공유하는 무형의 의존성 그래프가됩니다. 그 시점에서 전역 정적 변수를 사용하고 모든 상용구를 제거 할 수 있습니다.
이것을 해결하는 효과적인 방법이 있습니까? 내가 가진 아이디어 중 하나는 구성 요소가 특정 기능을 갖도록하는 것입니다. 예를 들어 StatComponent
attack()
기본적으로 정수를 반환하지만 파워 업이 발생할 때 구성 할 수 있습니다.
attack = getAttack compose powerupBy(20) compose powerdownBy(40)
이것은 attack
여러 시스템에서 액세스하는 구성 요소에 저장 해야하는 문제를 해결하지 못하지만 적어도 충분히 지원하는 언어가 있으면 함수를 올바르게 입력 할 수 있습니다.
// In StatComponent
type Strength = PrePowerup | PostPowerup
type Damage = Int
type PrePowerup = Int
type PostPowerup = Int
attack: Strength = getAttack //default value, can be changed by systems
getAttack: PrePowerup
// these functions can be defined in other components or in PowerupSystems
powerupBy: Strength -> PostPowerup
powerdownBy: Strength -> PostPowerup
subtractArmor: Strength -> Damage
// in DamageSystem
dealDamage: Damage -> () = attack compose subtractArmor compose hurtSomeEntity
이렇게하면 시스템에 의해 추가 된 다양한 기능의 올바른 순서를 보장합니다. 어느 쪽이든, 나는 여기서 기능적 반응성 프로그래밍에 빠르게 접근하고있는 것 같습니다. 처음부터 그것을 사용해서는 안되는지 나 자신에게 묻습니다 (FRP 만 보았으므로 여기에 잘못되었을 수 있습니다). ECS는 복잡한 클래스 계층 구조에 비해 개선 된 것이지만 그것이 이상적이라고 확신하지는 않습니다.
이 문제에 대한 해결책이 있습니까? ECS를보다 명확하게 분리하기 위해 누락 된 기능 / 패턴이 있습니까? FRP가이 문제에 더 적합합니까? 이 문제들이 내가 프로그램하려고하는 것의 본질적인 복잡성으로 인해 발생 하는가? 즉, FRP에도 비슷한 문제가 있습니까?