岡オカ営業所 ホームへ

チュートリアル 1

TransportXの構造

TransportXのデータ作者として最初の一歩を踏み出すにあたり、まずはTransportXのシステムやデータの大まかな構造を俯瞰してみましょう。

はじめに:TransportXとは

改めてTransportXとは、ユーザーが自由にマップや車両を作成できる3DCGバスシミュレーターです。 作りたいものは何でも作れるその拡張性の高さが一番の特長ですが、これを実現するために、TransportX本体のシステムやTransportX用のデータの構造にも工夫が施されています。

システムの構成

TransportXの内部は、次のような階層構造となっています。

TransportXのシステム構成

最も根本の部分にランタイムという概念があり、その上にワールドオブジェクト/ネットワーク交通の順で層が積み上げられていきます。各層について簡単に説明していきます。

ランタイム

「ランタイム」は、ゲームの根幹を担う層です。 3Dモデルをどのように描画するか(シェーダーなど)や、適用する物理法則、カメラ、プレイ情報の保存・読込方法、右クリックメニューなど、ゲーム全体に関する機能をこの層で設定します。

一般的な使い方をしている限り、この層に意識して触れることはほぼありません。

ワールド

「ワールド」は、ゲーム内の空間を定義する層です。 太陽の方角などの空間全体に関する機能をこの層で設定するほか、3Dモデルや交通ネットワーク、プレイヤー車両/AI車両など、この上の層を統括管理する役割があります。

オブジェクト/ネットワーク

ワールドを構成するのが「オブジェクト」と「ネットワーク」です。

オブジェクトはワールド上に設置された3Dモデルのことで、建物や信号機、道路標識といったその場から動かない物の他、車両、歩行者などの「交通」(後述)も含みます。 ネットワークは道路における車線や歩道のように、「交通」がワールド上を動き回る際に従う進路のことです。

以上のように、見た目(物理面)を司る「オブジェクト」と、車などが動くルール(論理面)を司る「ネットワーク」の2つによってワールドが成り立っているわけです。

交通

「交通」は、車両や歩行者といったワールド上を動き回る存在を定義する層です。 原則として、各交通は先述のネットワークのルール(論理)に従って動き、オブジェクトによってワールド上にその存在(物理)が描画されることとなります。

交通はその特性によって、アバターエージェントという大きく2つの種類に区別することができます。 アバターはプレイヤーが操作する交通のことで、基本的にカメラ(ゲーム内の視点)はこのアバターに追随することとなります。 一方で、エージェントはアバター以外の全ての交通を指します。エージェントはアバターと異なり、原則としてプログラムにより自動的に動くこととなります。

データの構成

TransportX用のデータは、ここまでに説明したTransportX本体の構造をおおむねトレースしたような構成となっています。

TransportX用データの構成

最も根本の部分にワールド情報ファイルと呼ばれるxmlファイルがあり、この中で先述したランタイムワールドとして何を読み込むかを指定します。 また、プレイヤー車両などのアバターは、ワールド情報ファイル内で指定するのではなく、ワールド内でどのアバターを読み込むのか指示する仕様となっています。

ワールド情報ファイル

「ワールド情報ファイル」はデータの概要をまとめたファイルです。 先述したようにランタイムワールドとして何を読み込むかを指定する他、およびこのデータの名前や説明などを記述します。

なお、この時点で「ランタイム」の概念の理解に自信がない方もいらっしゃるかもしれませんが、 ランタイム(描画エンジンや物理エンジン、プレイ情報の保存・読込など)は必ずしもデータ作者自身が実装しなければならないわけではなく、よく使われる機能をひと通り揃えたデフォルトの実装が存在します。 基本的にはデフォルトのものを使用することになるため、必ずしも現時点で正確に理解しておく必要はなく、このまま進んでしまっても構いません。

ランタイム(やや難、飛ばしても構いません)

先述したように、「ランタイム」は3Dモデルの描画方法や物理法則、カメラ、プレイ情報の保存・読込方法、右クリックメニューなど、ゲームの根幹に関する機能を設定する層です。 一般的にはC#で開発し、.dll形式で配布します。デフォルトの実装が TransportX.dll 内に存在し(TransportX.Runtime クラス)、基本的にはこれを使用することとなりますが、 ランタイムを自作すれば、独自のシェーディングモデルを適用してより美麗なグラフィックを実現したり、独自のタイトル画面などのGUIを追加したり、ある条件に従って読み込むワールドを動的に差し替えたりと、 デフォルトのランタイムの制約に囚われない更に高度なカスタマイズが可能となります。

ワールド

ここで「ワールド」と表記している部分は、太陽の方角などの空間全体に関する設定から、オブジェクトネットワークの設置までの全てを含んでいます。 TransportX α0.3の時点では、プログラミング方式スクリプト方式の2種類のワールドの作り方をサポートしています。

プログラミング方式は、純粋なプログラミングによってワールドを制作する方式です。C#などの.NET言語を使って開発します。

スクリプト方式は、「スクリプト」と呼ばれる簡単なテキストを記述する方式です。 例えば PutProp と書いたら物体(オブジェクト)が設置されるというように、通常のプログラミングよりも直感的な記法でワールドを制作可能です。

現時点でワールドを制作される方は、基本的にこちらのスクリプト方式を採用されることを推奨します。 スクリプトで実現できることはプログラミング方式と比較して制約がありますが、追って説明する「コンポーネント」と呼ばれるシステムを活用すれば、実質的にプログラミング方式と同等の制作自由度を実現できます。

なお将来的にはこれら2方式の他に、専用のGUIエディタによる更に簡単な制作方法もサポートする予定です。

アバター

プレイヤーが操作する車両や歩行者などである「アバター」は、TransportX α0.3の時点ではプログラミング方式のみのサポートとなっており、C#などの.NET言語を使って開発することとなります。 スクリプト方式を近日実装予定です。

終わりに

ここまで、TransportX本体のシステム構成、およびそれに則ったTransportX用データの構成を簡単に説明してきました。次章以降ではいよいよ、ワールドなどの具体的な文法について解説していきます。