こんにちは、トイロジックでツール業務を担当しているプログラマーのIです。主にプロジェクトで使用するGUI/CUIツールやDCCツールの作成・整備を行っています。

弊社では「Toylo Engine」という名前で自社エンジンの開発を進めています。
2021年に発売された『NieR Replicant ver.1.22474487139…』や、現在オープンベータ中の『Warlander』は「Toylo Engine」を使用して開発されています。

本記事では、Toylo Engineで使用されるゲームデータとその内製ツールについて少しご紹介させていただきます。

Toylo Engineで使用するゲームデータ

紹介に入る前にToylo Engineで使用されているゲームデータのフォーマットに関して少し触れておこうと思います。

Toylo Engineでは主にXonというXML形式のデータを使用します。中身は普通のXMLなのですが、必ずXMLスキーマでデータ構造を定義しています。

【注意:Xonは実際に存在するフォーマットではなく、拡張子を「.xon」としていたため、XMLスキーマを使用するゲームデータのことを「Xon」と呼んでいます】

このスキーマはツールで編集するパラメータのエディタを自動生成する時や、アセットのビルドを行う際にデータのフォーマットチェック、C++のクラスの自動生成などに使用されます。

XMLスキーマって?

XMLスキーマとは、XML文章のスキーマ定義を行うスキーマ言語のことです。簡単に言うと、要素の順番や、要素がどのような型の属性持っているのかなどXMLのデータ構造を定義するためのものです。

 

パラメータ編集ツールについて

前述のとおり、Toylo Engineでは主にXonというXML形式のデータを使用しています。このXonを編集するための内製ツールがXonEditorと呼ばれるツールです。

XonEditorはパラメータデータとしてのXonを編集するツールとして使用されています。XonEditorでは編集が難しいデータは別途そのデータを作成するのに特化したツールを用意しています。

 

スキーマからプロパティエディタの自動生成

前述で、XonはXMLスキーマを使用したゲームデータということをお伝えしましたが、XonEditorではスキーマからプロパティを編集するためのエディタを自動生成しています。

どういうことなのかスキーマの例とエディタでどう表示されているかの画像で簡単に説明していきます。
 

スキーマで属性を追加してみる

ではまず、XMLスキーマにて属性を一つ追加してみます。

<xs:complexType name="BlogSampleData">
    <xs:annotation>
        <xs:appinfo>
            <xon.type label="ブログ用サンプルデータ"/>
            <xon.attribute name="param1" label="param1"/>
        </xs:appinfo>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="xon:GameObject">
            <xs:attribute name="param1" type="xon:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

※スキーマは例となりますのでいろいろと省いているところはありますがご了承ください。

 
スキーマではBlogSampleDataという型を作成し、param1という属性を一つ追加しました。属性はクラスのメンバ変数だと思ってください。

エディタの方を見ていただくとプロパティエディタにparam1という文字列入力のエディタが表示されているかと思います。

ここで、param1の型を変更してみましょう。

<xs:attribute name="param1" type="xon:vec3"/>

属性の型をxon:vec3に変更してみました。するとエディタ側のプロパティエディタのparam1のエディタが変わっていることがわかります。
 

スキーマで要素を追加してみる

次に、XMLスキーマにて要素を一つ追加してみます。

<xs:complexType name="BlogSampleElement">
    <xs:annotation>
        <xs:appinfo>
            <xon.type label="ブログ用サンプルエレメント"/>
            <xon.attribute name="param2" label="param2"/>
        </xs:appinfo>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="xon:GameObject">
        <xs:attribute name="param2" type="xon:color"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="BlogSampleData">
    <xs:annotation>
        <xs:appinfo>
            <xon.type label="ブログ用サンプルデータ"/>
            <xon.element name="elem1" label="elem1"/>
            <xon.attribute name="param1" label="param1"/>
        </xs:appinfo>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="xon:GameObject">
            <xs:sequence>
                <xs:element name="elem1" type="BlogSampleElement" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="param1" type="xon:vec3"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

スキーマにBlogSampleElementという型を作成し、BlogSampleDataelem1という要素を追加しました。

エディタの方を見ていただくとプロパティエディタにelem1というリストが追加されています。画像ではエディタで要素を一つ追加しているためelem1 [0]が存在しています。

エレメントはスキーマで指定するminOccursmaxOccursによってエディタでも変化します。

※XMLスキーマでは「minOccurs」「maxOccurs」で出現する要素の個数を制限することができます

<xs:element name="elem1" type="BlogSampleElement" minOccurs="2" maxOccurs="2"/>

要素の個数を「2」固定にしてみました。エディタでも最初から要素が2個追加された状態になり、追加削除ができません。追加できる要素の上限や下限などもスキーマに指定されている値からエディタ上でも自動的に制限をかけます。

最後に

本記事では、Toylo Engineで使用しているXonEditorというパラメータ編集ツールXMLスキーマの関係について簡単にご紹介させていただきました。

今回ご紹介したのはXMLスキーマの情報からエディタの自動生成を行う中での一部の機能ですが、スキーマでデータ構造を定義することでエディタでもその情報を使用することができ、プログラマーが組む様々なデータ構造にエディタが自動で対応できるようになります。

今回紹介させていただいたXonについては、弊社プログラマーの林が「CEDEC+KYUSHU 2021」にて講演しておりますので、興味のある方はリンクをご確認ください。また内製ツールについても少し触れています。

著者紹介 I
2015年にトイロジックに新卒入社。プログラマーとして複数のプロジェクトでDCCツールの作成、UI、システム周りを経験し、現在はライブラリ班でツール業務を担当しています。