엔티티 구성을 스크립트 외부에 배치하는 이유는 무엇입니까?


11

스크립트 파일에서 엔터티 구성 요소를 정의하는 많은 게임을 보았지만 각 엔터티를 구성하고 구성 요소를 지정하면 XML과 같은 다른 파일 형식을 사용합니다. 왜 그렇게합니까?

나는 주로 다른 사람들의 이론적 근거가 무엇인지를 묻습니다. 나는 또한 (내가 JSON하지 XML을 선택하지만) 스크립트의 외부 나의 실체를 구성합니다. 이 작업을 수행하는 이유는 저장 게임을보다 쉽게 ​​구현할 수 있도록하기위한 것이며 이러한 구성은 XML 또는 JSON과 같은 방식으로 더 잘 구성되어 있다고 생각하기 때문입니다.


@ Christopher Larsen의 답변 : 댓글로 게시하기에 너무 오래

나는 당신이 질문의 주제에서 약간 벗어 났을 까 걱정됩니다. 설명하는 문제는 계층 기반 엔터티와 관련이 있습니다. 내 질문에 내가 구성 요소 기반 엔터티에 대해 이야기하고 있다고 언급했습니다.

다음은 내가 묻고 싶었던 예입니다. 다음은 엔터티를 구성하는 두 가지 대체 방법입니다 (스크립트 및 외부 JSON 파일 사용). 제 질문은 왜 많은 사람들이 스크립트 외부에서 엔티티를 구성하는 것을 선호합니까?

기본 엔티티 클래스 :

class Entity:
    def __init__(self, name):
        pass
    def addComponent(self, comp):
        pass

스크립트 접근 방식 :

orc = Entity('Orc')
orc.addComponent(PositionComponent(3.4, 7.9))

JSON 접근 방식 :

{
    "name" : "Orc",
    "components":
    {
        "PositionComponent": {
            "x" : 3.4,
            "y" : 7.9
        }
    }
}

기술적이고 조직적인이 방법을 사용하는 이유를 이미 언급했습니다. 나는 왜 내가 본 많은 다른 사람들이 이것을 사용하는지 알고 싶었습니다.

답변:


13

내 마음에 오는 주요 이점은 프로그래머가 아닌 사람이 게임 스크립트를 터치하지 않고도 구성을 편집 / 관리 할 수 ​​있다는 것입니다.


이것은 단순히 두 개의 파일 (.h와 .cpp의 등가)을 가짐으로써 달성 될 수 있습니다. 나는 어떤 논리를 추가하고 싶지 않은 객체를 만들고 싶을 사람 (화병처럼 보이고 아무것도 보이지 않는 것으로 말하지만)을 궁금해합니다. 사람이 꽃병에있는 꽃에서 꽃가루로 덮인 경우 나비를 끌어들입니다). 사람이 읽을 수있는 것은 훌륭하고 이것이 왜 그런지에 대한 내 생각 중 하나이지만 JSON, Lua 테이블 및 XML은 모두 프로그래머가 아닌 사람과 비슷한 수준의 사람이 읽을 수 있습니다.
제임스

2
Glest는 xml로 개조 된 게임입니다. 많은 프로그래머가 아닌 사람들이 그것을 위해 개조합니다. 스크립트보다 xml / json을 사용하는 것이 더 접근하기 쉽습니다.
Will

6

내가 보통 스크립트 대신 구성 파일을 사용하는 한 가지 이유는 다음과 같습니다.

모든 값을 지정하는 등 스크립트의 정확성을 검사하는 유일한 방법은 스크립트를 실행하는 것입니다.

스크립트가 값을 구성 할 수 있도록 코드를 작성한다는 것은 스크립트가 값을 채울 스크립트에 대한 스켈레톤 오브젝트를 작성하고 스크립트가 그렇게했는지 검증하는 코드 작성을 의미합니다. 플랫 구성 파일에서로드하는 것보다 더 많은 코드와 버그가 많은 코드가 있으며 종종 일종의 유효성 검사 메커니즘을 지원하는 라이브러리를 사용합니다.


5
주류 소프트웨어 개발이 더 좋았을 때, 이것을 Least Power원칙 으로 알려졌습니다 . 요즘 우리는 가장 강력한 솔루션이 아니라 가장 강력한 솔루션을 선택해야하는 이유를 알아야합니다. 그 이유는 언어가 덜 강력할수록 해당 언어로 저장된 데이터로 더 많은 일을 할 수 있기 때문입니다.

1
@Joe 실제로이 접근 방식을 사용하는 이유 중 하나를 잘 설명하고 있습니다. 처음에는 스크립트로 엔티티를 구성하려고 시도했지만 게임 저장을 구현하기가 어렵다는 것을 알았습니다 (구성 요소 간의 관계를 추적 할 수 없음). 외부 설정 파일을 사용하면 많은 도움이됩니다.
Paul Manta

스크립팅 인터페이스를 이미 사용하고 있다면 이미 정의 된 스크립팅 인터페이스를 사용하는 대신 구성 파일에 대한 데이터 유효성 검사 방법을 제공해야합니다.
제임스

2

엔터티 구성은 단순히 특정 엔터티 의 직렬화 일 수 있습니다 . 이를 통해 게임 편집 및 모딩 도구의 출력을 저장 게임과 거의 같은 방식으로 처리 할 수 ​​있습니다. 특히, 특정 개체가 게임 저장 중 어떤 상태에 있는지 예측할 수없는 게임 (예 : AI 때문에 또는 부분적으로 절차 적으로 생성 된 게임)의 경우 전체를 덤프 할 수 있으면 유용합니다 저장 될 바이트 스트림으로 엔티티가 "하는"것을 정의하는 데이터.


1

설명하는 패턴은 데이터 기반 시스템의 구현입니다.

데이터 기반 시스템은 컨텐츠의 정의를 소스 외부에서 캡슐화 할 수 있으므로 게임 개발에 일반적으로 사용됩니다. 이 외부 표현은 엔터티의 동작 방식을 변경하기 위해 쉽게 수정 (및 수정을 감시하는 응용 프로그램에서 실시간으로 업데이트) 할 수 있습니다.

데이터가 외부 적으로 정의되면 텍스트 파일 직접 편집 (ugh!)에서부터 논리적이고 일관되며 정확성을 위해 디자이너의 선택을 안내하는 정교한 UI에 이르기까지 디자이너가 데이터와 상호 작용하는 방법에 대한 모든 종류의 가능성이 있습니다. 게임 밸런스의 관점) 방식.

데이터가 코드에 직접 임베드 된 경우 변경 작업을 수행하려면 대규모 프로젝트의 경우 바이너리를 배포하는 데 필요한 시간뿐만 아니라 대규모 프로젝트의 경우 약간의 시간이 소요되는 애플리케이션을 다시 빌드해야합니다 (예 : 새 바이너리를 배포해야합니다). 섬기는 사람).

"오크"라는 입체적인 실체를 예로 들어 보자 ...

우리 오크를 구현하는 한 가지 방법은 오크에 대한 모든 특성과 논리의 코드로 완전한 설명을 작성하는 것입니다.

  • 최대 건강 = 10
  • 초당 피해 = 3
  • 가출 = true
  • runawaywhen = health <10
  • 공격적 = true

오크를 인스턴스화하면 모든 값이 정확히 동일하게 초기화되거나 정적으로 초기화됩니다. 발생하는 문제는 일부 디자이너가 와서 말하기를 "우리는 초보자 지역을 위해 다른 유형의 오크가 필요합니다. 건강이 떨어지고 도망 치지 않으며 공격적이지 않습니다. 새로운 플레이어가 전투 시스템을 배우는 동안 난이도와 혼란이 증가했습니다. "

좋아, 이제 당신은 다른 클래스가 필요하거나 (아마도 우리가 앞을 내다 보았을 때) "초보자"영역에서 오크를 만들 때 "공장"에 공급하는 값을 조정합니다. 따라서 변경하고 새 바이너리를 배포합니다. 플레이 테스터가 돌아와서 한 번의 타격으로 오크를 죽이면 새로운 체력 수치가 너무 낮다고 말합니다.

Google 시스템이 데이터 중심 (및 수정시 재로드를 지원하는 응용 프로그램의 보너스 포인트) 인 경우 디자이너 및 플레이 테스터를 만족시키는 데 필요한 수정은 재 컴파일 / 배포가 필요없는 간단한 데이터 변경입니다. 이것은 코드 변경을 기다리지 않기 때문에 디자이너를 행복하게 만들고, 값을 조정하기 위해 소스 코드를 지속적으로 수정하기 때문에 프로그래머에게 행복합니다.

데이터 중심 시스템을 최대한 활용하면 코드를 전혀 변경하지 않아도 데이터를 간단하게 변경하여 게임 수준, 주문, 퀘스트까지 모든 것을 구현할 수 있습니다. 결국 게임 콘텐츠를 쉽게 만들고, 수정하고, 반복 할 수있게하는 것입니다.


2
스크립트는 또한 대부분의 정의에 의한 데이터입니다
Will

1
-1. 문제는 데이터 구동 대 하드 코딩이 아니라 동적 스크립팅과 정적 선언에 관한 것입니다.

@Christopher OP에 긴 답변을 추가했습니다. 그것을 확인하시기 바랍니다.
Paul Manta

0

귀하의 예에서는 실제로 두 개의 스크립팅 언어를 이미 사용하고 있습니다. 이것이 장기적으로 말하면 좋은 방법이지만 사용중인 스크립팅 언어를 통합하는 것이 좋습니다. 제공 한 스크립트 예제가 Json 대신 Lua에서 수행 된 경우 Lua의 테이블을 사용하여 오브젝트를 빌드한다고합니다. 구문은 실제로 비슷하며 구성 요소를 노출하기위한 하나의 인터페이스를 지원할 수 있습니다.

사람들이 일반적으로 XML로 선택한 다음 논리로 스크립트를 작성하는 이유를 설명하는 것은 말할 때 이것이 의미가 있다는 것입니다. 다음은 데이터에서 객체에 대한 정의입니다. 좋은 데이터 저장 형식은 무엇입니까? 거의 항상 XML입니다 (JSON도 사용하지만). 그리고 그들이 논리에 추가하고 싶을 때, 그것은 코드화되거나 스크립트 파일에 저장됩니다.

그것은 잘못된 생각이 아니라 내 눈에 사람들이 다음 단계로 가고 있지 않습니다. 전체 언어 c / c ++ / c #을보십시오. 스크립팅 인터페이스에서 객체와 로직을 모두 한 언어로 정의 할 수 있습니다. 스크립팅 인터페이스에서 동일한 기능을 사용하지 않는 이유는 ... 클래스를 XML로 정의하고 메소드를 c #으로 정의해야하는 것과 거의 같습니다. 어쩌면 오래된 게임 스크립팅 언어는 충분히 강력하지 않았고 여전히 그 방식대로 유지되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.