현재 구성 요소 기반 엔터티 시스템을 구현하려고합니다. 엔터티는 기본적으로 단지 ID이며 여러 구성 요소를 묶어 게임 객체를 형성하는 도우미 메서드입니다. 그 목표는 다음과 같습니다.
- 컴포넌트에는 상태 만 포함됩니다 (예 : 위치, 상태, 탄약 수) => 로직은 "시스템"으로 들어가고 이러한 컴포넌트와 해당 상태 (예 : PhysicsSystem, RenderSystem 등)를 처리합니다.
- 순수한 C #과 스크립팅 (Lua)을 통해 구성 요소와 시스템을 구현하고 싶습니다. 기본적으로 C # 소스를 다시 컴파일하지 않고도 Lua에서 완전히 새로운 구성 요소와 시스템을 직접 정의 할 수 있기를 원합니다.
이제 효율적이고 일관되게 처리하는 방법에 대한 아이디어를 찾고 있으므로 C # 구성 요소 또는 Lua 구성 요소에 액세스하기 위해 다른 구문을 사용할 필요가 없습니다.
현재 접근 방식은 일반 공개 속성을 사용하여 C # 구성 요소를 구현하는 것입니다. 아마도 편집기에 기본값과 내용을 알려주는 몇 가지 특성이 있습니다. 그런 다음 C # 클래스 "ScriptComponent"를 사용합니다.이 스크립트는 스크립트에 의해 생성되고 해당 특정 구성 요소 유형의 모든 상태를 유지하는이 테이블로 Lua 테이블을 내부적으로 래핑합니다. 컴파일 타임에 알 수 없으므로 C # 측면에서 그 상태에 많이 액세스하고 싶지 않습니다. 어떤 속성을 사용할 수있는 ScriptComponents가 있습니까? 그래도 에디터는 액세스해야하지만 다음과 같은 간단한 인터페이스로 충분합니다.
public ScriptComponent : IComponent
{
public T GetProperty<T>(string propertyName) {..}
public void SetProperty<T>(string propertyName, T value) {..}
}
Lua 테이블에 액세스하여 Lua에서 해당 속성을 설정 및 검색하면 순수 C # 구성 요소에도 쉽게 포함될 수 있습니다 (그러나 리플렉션 등을 통해 일반 C # 속성 사용). 일반 게임 코드가 아닌 에디터에서만 사용되므로 성능은 그다지 중요하지 않습니다. 특정 구성 요소 유형이 실제로 제공하는 특성을 문서화하는 일부 구성 요소 설명을 생성하거나 필기해야하지만 큰 문제는 아니며 충분히 자동화 될 수 있습니다.
그러나 Lua 쪽에서 구성 요소에 액세스하는 방법은 무엇입니까? 비슷한 getComponentsFromEntity(ENTITY_ID)
것을 호출하면 아마도 "ScriptComponent"를 포함하여 많은 네이티브 C # 구성 요소를 userdata로 얻을 것입니다. 래핑 된 Lua 테이블에서 값 GetProperty<T>(..)
에 액세스하면 다른 C # 구성 요소와 마찬가지로 속성에 직접 액세스하는 대신 메서드를 호출하게 됩니다.
getComponentsFromEntity()
랩어 된 테이블을 대신 반환하는 "ScriptComponent"를 제외한 모든 네이티브 C # 구성 요소를 userdata로 반환하는 Lua에서만 호출 할 특수 메서드를 작성할 수도 있습니다. 그러나 다른 구성 요소 관련 메서드가있을 것이고 실제로 C # 코드 또는 Lua 스크립트에서 호출하기 위해 이러한 모든 메서드를 복제하고 싶지 않습니다.
궁극적 인 목표는 모든 유형의 구성 요소를 동일하게 처리하는 것입니다. 기본 구성 요소와 Lua 구성 요소, 특히 Lua 측면과 차별화되는 특별한 구문은 없습니다. 예를 들어 Lua 스크립트를 다음과 같이 작성할 수 있습니다.
entity = getEntity(1);
nativeComponent = getComponent(entity, "SomeNativeComponent")
scriptComponent = getComponent(entity, "SomeScriptComponent")
nativeComponent.NativeProperty = 5
scriptComponent.ScriptedProperty = 3
스크립트는 실제로 어떤 종류의 구성 요소를 가져도 상관 없으며 C # 측에서 사용하는 것과 동일한 방법을 사용하여 구성 요소를 검색, 추가 또는 제거하고 싶습니다.
스크립팅을 이와 같은 엔터티 시스템과 통합하는 샘플 구현이 있습니까?