어제 GDC Canada에서 속성 / 행동 엔터티 시스템에 대한 프레젠테이션을 읽었으며 꽤 훌륭하다고 생각합니다. 그러나 이론적으로뿐만 아니라 실제로 사용하는 방법을 잘 모르겠습니다. 우선이 시스템의 작동 방식을 신속하게 설명하겠습니다.
각 게임 개체 (게임 오브젝트)가 구성되어 속성 과 (또한 "외부 코드"에 의해 동작에 의해 액세스 될 수 = 데이터) 동작 (포함 = 로직, OnUpdate()
및 OnMessage()
). 예를 들어 브레이크 아웃 클론에서 각 브릭은 (예!) PositionAttribute , ColorAttribute , HealthAttribute , RenderableBehaviour , HitBehaviour로 구성 됩니다. 마지막은 다음과 같이 보일 수 있습니다 (C #으로 작성된 작동하지 않는 예일뿐입니다).
void OnMessage(Message m)
{
if (m is CollisionMessage) // CollisionMessage is inherited from Message
{
Entity otherEntity = m.CollidedWith; // Entity CollisionMessage.CollidedWith
if (otherEntity.Type = EntityType.Ball) // Collided with ball
{
int brickHealth = GetAttribute<int>(Attribute.Health); // owner's attribute
brickHealth -= otherEntity.GetAttribute<int>(Attribute.DamageImpact);
SetAttribute<int>(Attribute.Health, brickHealth); // owner's attribute
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
else if (m is AttributeChangedMessage) // Some attribute has been changed 'externally'
{
if (m.Attribute == Attribute.Health)
{
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
}
이 시스템에 관심이 있으시면 여기 (.ppt)를 참조 하십시오 .
내 질문은이 시스템과 관련이 있지만 일반적으로 모든 구성 요소 기반 엔터티 시스템입니다. 나는 실제 컴퓨터 게임에서 이러한 것들이 실제로 어떻게 작동하는지 보지 못했습니다. 왜냐하면 좋은 예제를 찾을 수 없으며 문서를 찾지 못하면 문서화되어 있지 않으며 의견이 없으므로 이해할 수 없기 때문입니다.
그래서 무엇을 물어보고 싶습니까? 비헤이비어 (구성 요소)를 디자인하는 방법 GameDev SE에서 가장 일반적인 실수는 많은 구성 요소를 만들고 단순히 "모든 것을 구성 요소로 만드는 것"이라는 것입니다. 나는 그것이 구성 요소의 렌더링을하지 제안 것 읽었지만 (그래서 대신 외부에서 작업을 수행 한 RenderableBehaviour , 그것은 어쩌면해야 RenderableAttribute , 그리고 기업이있는 경우 RenderableAttribute이 true로 설정 한 다음 Renderer
(클래스는 관련이없는 구성 요소, 엔진 자체)) 화면에 그려야합니까?).
그러나 행동 / 구성 요소는 어떻습니까? 이 전 수준을 얻고, 레벨에서는, 거기했다고 가정 해 봅시다 Entity button
, Entity doors
하고 Entity player
. 플레이어가 버튼 (충돌에 의해 토글되는 플로어 버튼)과 충돌하면 눌려집니다. 버튼을 누르면 문이 열립니다. 글쎄, 이제 어떻게해야합니까?
플레이어는 CollisionBehaviour 를 가지고 있는데, 플레이어가 무언가와 충돌하는지 확인합니다. 그가 버튼과 충돌 CollisionMessage
하면, button
엔티티에 a 를 보냅니다 . 메시지는 필요한 모든 정보를 포함합니다 : 누가 버튼과 충돌했는지. 버튼에 ToggleableBehaviour 가 있으며 , 이 버튼 을 받게됩니다 CollisionMessage
. 누가 충돌했는지 확인하고 해당 엔티티의 무게가 버튼을 토글하기에 충분히 큰 경우 버튼이 토글됩니다. 이제 버튼 의 ToggledAttribute 를 true로 설정합니다. 알았어,하지만 지금은?
버튼이 다른 모든 객체에 다른 메시지를 보내서 전환되었음을 알려야합니까? 이런 식으로 모든 일을하면 수천 개의 메시지를받을 수 있고 지저분해질 것입니다. 어쩌면 이것이 더 낫습니다. 문은 연결된 버튼이 눌 렸는지 여부를 지속적으로 확인하고 그에 따라 OpenedAttribute를 변경합니다 . 그러나 그것은 문의 OnUpdate()
방법이 끊임없이 무언가를 할 것임을 의미합니다 (실제로 문제가 있습니까?).
두 번째 문제는 더 많은 종류의 버튼이 있다면 어떨까요? 하나는 압력에 의해 눌려지고, 다른 하나는 그것을 쏘아서 토글되고, 다른 하나는 물을 부으면 토글됩니다. 이것은 다른 행동을 가져야 함을 의미합니다.
Behaviour -> ToggleableBehaviour -> ToggleOnPressureBehaviour
-> ToggleOnShotBehaviour
-> ToggleOnWaterBehaviour
이것이 실제 게임이 작동하는 방식입니까 아니면 내가 바보입니까? 어쩌면 하나의 ToggleableBehaviour 만 가질 수 있으며 ButtonTypeAttribute 에 따라 작동합니다 . 따라서이 경우이 작업 ButtonType.Pressure
을 수행합니다.이 경우 ButtonType.Shot
다른 작업을 수행합니다.
그래서 나는 무엇을 원합니까? 내가 제대로하고 있는지 묻고 싶거나 어리 석고 구성 요소의 요점을 이해하지 못했습니다. 구성 요소가 게임에서 실제로 어떻게 작동하는지에 대한 좋은 예를 찾지 못했습니다. 구성 요소 시스템을 만드는 방법을 설명하지만 사용 방법을 설명하지 않는 자습서가 있습니다.