FPS를위한 엔터티 시스템을 설계했습니다. 기본적으로 다음과 같이 작동합니다.
우리는 GameWorld라는 "세계"오브젝트를 가지고 있습니다. 여기에는 GameManager 배열과 ComponentManager 배열이 있습니다.
GameObject는 Component의 배열을 보유합니다. 또한 매우 간단한 이벤트 메커니즘을 제공합니다. 컴포넌트 자체는 이벤트를 엔티티에 보낼 수 있으며, 이는 모든 컴포넌트에 브로드 캐스트됩니다.
컴포넌트는 기본적으로 게임 오브젝트에 특정 속성을 제공하는 것입니다. 게임 오브젝트는 실제로 컨테이너의 컨테이너이므로 게임 오브젝트와 관련된 모든 것은 컴포넌트에서 발생합니다. 예를 들어 ViewComponent, PhysicsComponent 및 LogicComponent가 있습니다. 그들 사이의 의사 소통이 필요하다면, 그것은 이벤트의 사용을 통해 이루어질 수 있습니다.
ComponentManager는 Component와 같은 인터페이스이며 각 Component 클래스마다 일반적으로 하나의 ComponentManager 클래스가 있어야합니다. 이러한 구성 요소 관리자는 구성 요소를 만들고 XML 파일과 같은 속성에서 읽은 속성으로 구성 요소를 초기화해야합니다.
ComponentManager는 외부 라이브러리를 사용하는 PhysicsComponent와 같은 구성 요소의 대량 업데이트도 처리합니다.
구성 기능을 위해 XML 파일 또는 스크립트를 읽고 파일에 지정된 구성 요소를 작성하는 엔티티 (대량 업데이트를 위해 올바른 구성 요소 관리자에 참조를 추가 함)에 팩토리를 사용합니다. 그런 다음 GameObject 오브젝트에 주입하십시오.
이제 내 문제가 온다 : 멀티 플레이어 게임에 이것을 사용하려고합니다. 나는 이것에 접근하는 방법을 모른다.
첫째 : 고객이 처음부터 어떤 엔티티를 가져야합니까? 싱글 플레이어 엔진이 어떤 엔티티를 만들지 결정하는 방법부터 설명해야합니다.
레벨 편집기에서 "브러시"및 "엔티티"를 만들 수 있습니다. 브러쉬는 벽, 바닥 및 천장과 같은 것, 기본적으로 단순한 모양입니다. 엔터티는 내가 말한 게임 오브젝트입니다. 레벨 편집기에서 엔티티를 작성할 때 각 컴포넌트의 특성을 지정할 수 있습니다. 이러한 속성은 엔터티 스크립트의 생성자와 같은 것으로 직접 전달됩니다.
엔진의로드 레벨을 저장하면 엔티티 목록 및 관련 특성으로 분해됩니다. 브러시는 "월드폰"개체로 변환됩니다.
해당 레벨을로드하면 모든 엔티티를 표시합니다. 간단하게 들리나요?
이제 엔터티를 네트워킹하기 위해 수많은 문제가 발생했습니다. 첫째, 처음부터 클라이언트에 어떤 엔티티가 존재해야합니까? 서버와 클라이언트 모두에 레벨 파일이 있다고 가정하면 클라이언트는 서버의 게임 규칙 목적을 위해 존재하더라도 레벨의 모든 엔티티를 인스턴스화 할 수 있습니다.
또 다른 가능성은 서버가 서버에 대한 정보를 보내 자마자 클라이언트가 엔티티를 표시하는 것이므로 클라이언트는 필요한 엔티티 만 갖게됩니다.
또 다른 문제는 정보를 보내는 방법입니다. 서버가 델타 압축을 사용할 수 있다고 생각합니다. 즉, 모든 프레임에서 클라이언트로 스냅 샷을 보내는 것이 아니라 무언가가 변경 될 때만 새로운 정보를 보냅니다. 그러나 서버는 현재 각 클라이언트가 알고있는 것을 추적해야합니다.
마지막으로 엔진에 네트워킹을 어떻게 주입해야합니까? 네트워크 구성 요소 인 NetworkComponent를 생각하고 있습니다. 그러나 네트워크 구성 요소는 네트워크에 어떤 변수를, 그 변수에 액세스 하는지 , 그리고 클라이언트의 해당 네트워크 구성 요소가 네트워크 변수를 변경하는 방법을 알아야하는 방법을 어떻게 알아야합니까?
이 문제에 접근하는 데 큰 어려움이 있습니다. 당신이 도중에 나를 도와 주면 정말 감사하겠습니다. 구성 요소 시스템 디자인을 개선하는 방법에 대한 팁을 제공하므로 제안하는 것을 두려워하지 마십시오.