간단한 게임 엔진 (중요한 경우 C #)을 개발 중이며 아키텍처 측면에서 스크립팅을 구현할 수있는 적절한 방법을 생각할 수 없습니다.
논리에 독립적 인 사용자 정의 애니메이션이 포함 된 간단한 턴 기반 전략입니다. 여기에는 시스템 / 낮은 수준의 요소를위한 글로벌 아키텍처 계층이 있으며, 가장 중요한 것은 이벤트 관리자를 사용하여 통신하는 두 가지 주요 모듈 (논리 및 게임보기 사물)입니다.
문제는 스크립트가 게임 로직 관련 요소 (단위 매개 변수 변경 등)와 게임 뷰 관련 항목 (예 : 전투에 대한 특수 애니메이션 / 대화 상자)에 영향을 미치도록하는 것입니다. 특정 스크립트 트리거.
(솔직히 말해서, 게임 흐름을 제어하고 핵심 역학 / 그래픽 만 논리 /보기에 남겨 두는 것이 이상적입니다. 그러나 나는 새로운 것이기 때문에 지금 당장 할 수 있는지 확실하지 않습니다)
세 가지 옵션을 생각했습니다.
-
스크립팅을 논리에 맡기고 게임의 그래픽 측면에 대해 알려주십시오. 그러나 이것은 논리 /보기 부서를 매우 모호하게 만들 것입니다.
-
동일한 이벤트 관리자를 사용하여 다른 스크립트와 이벤트를 교환하는 별도의 모듈로 스크립트를 작성하십시오. 그러나 이것은 이벤트 동기화에 매우 신중해야하며, 이벤트 유형을 관리자에게 추가합니다. (아직도 개인적으로 좋아하는)
-
스크립팅을 무엇보다도 모듈로 만들어 로직 / 뷰의 기능에 직접 영향을 미치거나 호출 할 수 있습니다. 이를 통해 전체 이벤트 교환 체계를 망쳐 놓으면서 본질적으로 더 넓은 기능을 사용할 수 있으며 스크립트가 실제로는 안될 때에도 문제가 발생할 수 있습니다.
그래서, 나는 이것들 중 하나를 결정하거나 스크립팅 모듈을 삽입하는 더 좋은 방법을 생각할 수 없습니다 … 제안이나 유용한 링크?
감사합니다!
PS는 질문을 마이그레이션 해 주셔서 감사합니다 .gamedev에 대한 전문 섹션이 있는지 몰랐습니다.
답변
나는 당신이 세 번째 옵션을 원한다고 생각하지만 잠재적으로 두 곳에서 논리적 사건이 발생한다는 것은 당신의 생각에 옳다는 것을 알게 될 것입니다. 엔진의 로직 모듈이 ‘지금 무엇을해야합니까?’라는 두 가지 질문을하는 업데이트 틱이되기를 원한다는 것을 알게 될 것입니다. ‘어떻게해야합니까?’ 그런 다음 해당 질문에 대한 답변을 처리하기 위해 스크립트를 바인딩 할 수 있습니다.
데이터와 API를 포함하는 객체를 노출시켜 필요한 로직 구성 요소에 액세스하십시오 (AI 경로 검색 결과를 스크립팅 할 수는 있지만 사용하고 재사용 할 수있는 일반적인 코드이므로 왜 그렇지 않습니까? 모듈에 포함시킨 다음 스크립팅 언어에 노출 된 API에 추가 하시겠습니까?). 이를 통해 접근성 및 상황이 명확하게 정의 된 위치를 제공 할 수 있습니다.
다시, 나는 항상 똑같은 말로 이것을 경고합니다. 완성 된 작업 제품은 프로그래밍의 좋은 이론보다 항상 더 중요합니다. 🙂
도움이 되었기를 바랍니다!
답변
많은 사람들은 그러한 유연성이 속도를 낼 수 있다고 생각하는 강력한 동적 언어를 과소 평가하는 경향이 있습니다. 이것은 사실이지만 종종 비용은 무시해도됩니다.
개인적으로 표현력을 활용하는 동적 언어를 사용하여 가능한 한 많이 개발하는 경향이 있으며 최적화가 필요한 위치 와 경우 를 이해하기 위해 프로토 타입을 프로파일 링 합니다.
귀하의 경우 이는 세 번째 옵션으로 이동하여 스크립팅 언어로 사용할 수있는 적절한 동적 언어를 사용하여 “상위”부분을 개발해야한다는 것을 의미합니다.
다이내믹을 올바른 깊이에 놓은 후 많은 패턴을 사용할 수 있습니다. 사용자 정의 스크립트는 콜백 시스템으로 이벤트 기반 시스템에 통합 될 수 있습니다. 코어 콜백이 적절한 환경을 제공 할 수 있으므로 스크립트가 전체 시스템의 서브 세트 상태 또는 글로벌 상태를 변경할 수 있습니다.
Façade 패턴을 사용하여 스크립트가 상호 작용할 수있는 인터페이스를 캡슐화 할 수 있습니다. 파사드 방법에서 당신은 논리를 넣을 수를 정의 하는 방법 , 때 , 경우 스크립트가 기능을 사용하여 코어 구현에서 스크립트의 상호 작용을 추출 할 수 있습니다.
스크립트 인터페이스는 관련 팩토리 메소드를 제공하여 스크립트가 요소를 직접 인스턴스화하지 않고 요소를 생성 할 수 있도록해야합니다. 이러한 인스턴스는 실제 개체에 대한 래퍼 일 수 있으므로 추가 제어 액세스 논리를 구현할 수 있습니다.
답변
스크립팅 개체는 데이터를 제공 할 다른 개체에 액세스 할 수 있어야합니다. 이러한 다른 개체를 스크립팅 개체에 직접 전달하지 않도록주의하십시오. 취성 인터페이스를 만듭니다. 이러한 객체 참조를 관리하고 스크립팅 객체에 대한 데이터 액세스를 제공하는 중재자 클래스와 같은 것을 원할 수 있습니다.
답변
루아는 범용 스크립팅 언어로 널리 사용됩니다. Lex와 Yacc를 사용하여 자체 스크립트 언어를 만들 수 있지만 (Game Programming Gems 3의 기사를 확인하십시오) 크든 작든 Lua로 대부분의 요구 사항을 처리 할 수 있습니다.