こんにちは、トイロジックでツール業務を担当しているプログラマーの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
という型を作成し、BlogSampleData
にelem1
という要素を追加しました。
エディタの方を見ていただくとプロパティエディタにelem1
というリストが追加されています。画像ではエディタで要素を一つ追加しているためelem1 [0]
が存在しています。
エレメントはスキーマで指定するminOccurs
maxOccurs
によってエディタでも変化します。
※XMLスキーマでは「minOccurs」「maxOccurs」で出現する要素の個数を制限することができます
<xs:element name="elem1" type="BlogSampleElement" minOccurs="2" maxOccurs="2"/>
要素の個数を「2」固定にしてみました。エディタでも最初から要素が2個追加された状態になり、追加削除ができません。追加できる要素の上限や下限などもスキーマに指定されている値からエディタ上でも自動的に制限をかけます。
最後に
本記事では、Toylo Engineで使用しているXonEditorというパラメータ編集ツール
とXMLスキーマ
の関係について簡単にご紹介させていただきました。
今回ご紹介したのはXMLスキーマの情報からエディタの自動生成を行う中での一部の機能ですが、スキーマでデータ構造を定義することでエディタでもその情報を使用することができ、プログラマーが組む様々なデータ構造にエディタが自動で対応できるようになります。
今回紹介させていただいたXon
については、弊社プログラマーの林が「CEDEC+KYUSHU 2021」にて講演しておりますので、興味のある方はリンクをご確認ください。また内製ツールについても少し触れています。