XNA 2.0のコンテントパイプライン~その壱~

コンテントプロジェクト

XNA 2.0のプロジェクジェクトをソリューションエクスプローラで見ると以下のようになっています。

subproject

参照設定の項目が二つあることに気づいたでしょうか?これはContentがWindowsGame1のサブプロジェクトになっているからです。XNA 2.0では、このサブプロジェクト内にコンテントを追加します。その他にも、以前まではメインプロジェクトに記述されていたコンテントに関する情報、例えばコンテントがどのようにインポートされプロセスされるかの情報、カスタマイズされたコンテントパイプラインアセンブリの参照などが含まれます。

以前はWindows、Xbox 360の両対応のゲームを開発している時に、XNA 1.0ではそれぞれのプロジェクトに同じコンテントを追加しないといけませんでした。それだけでもコンテントの管理が面倒だったのですが、XNA 2.0になってプロセッサプロパティ対応になったので、細かいパラメーター設定まで両方のプラットフォームのプロジェクトで設定しないというのは面倒であり、エラーの原因にもなります。

そこで、XNA 2.0ではWindows、Xbox 360の両プラットフォームでコンテント情報を共有するための仕組みとしてできたのがコンテントサブプロジェクトです。

XNA 2.0ではWindowsプロジェクトを作ったときにプロジェクトの右クリックメニューで 「Create Copy of Project for Xbox 360...」 を選択すると、Windosプロジェクトを元にしてXbox 360用のプロジェクトを作ることができます。この時、両方のプロジェクトにコンテントプロジェクトが存在しますが実際には同じサブプロジェクトを参照しているだけです。

untitled

コンテントプロジェクトを共有している訳ですから、Windowsのコンテントプロジェクトにコンテントを追加すると、同じコンテントがXbox 360側のコンテントプロジェクトにも追加されるようになっています。これでWindows、Xbox 360両対応のゲームを作る時の手間が大幅に減ることになります。

コンテントプロジェクトの実体

このコンテントプロジェクト、テンプレートを使ってゲームプロジェクトを作った場合、 「プロジェクトフォルダ\Content」 フォルダ内にContent.contentprojというファイル名で作られます。

このファイル中身は知らない人には単なるXMLファイルのように見えますが、Visual Studio 2005から採用された新しいビルトツールであるMSBuildのプロジェクトになっています。Visual Studio 2005やVisual C# Express上でビルドした場合、裏ではMSBuildがビルドする仕事を担っています。

実は普段目にしている .csprojファイルもMSBuild用のプロジェクトファイルになっているのでパスの通っている状態でコマンドラインから

msbuild.exe myproject.csproj

と、タイプするとC#のプロジェクトをビルドすることができます。もちろん、Content.contentprojファイルも単独でビルドすることができます。つまり、コンテントビルドだけを単独で行うことができるわけです。

「コマンドラインなんて普段使わないから、関係ないのでは」 と思う人もいるかもしれませんが、この仕組みを利用して以前紹介したコンテントパイプラインのデバッグをする第3の方法に使える訳です。

この方法はVisual Studio 2005上でしか使えませんが、コンテントパイプライン拡張用のプロジェクトのプロパティ画面のデバッグ設定を以下のように変更することでコードに変更を加えることなくデバッグすることができます。

  1. 外部プログラムの開始にMSBuild.exeを指定する。(私の環境ではC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exeとなっていました)
  2. コマンドライン引数にデバッグ対象となるContent.cotentprojファイルをフルパスで指定する
  3. コンテントパイプライン拡張用のプロジェクトを実行する(右クリック/デバック/新しいインスタンスを開始)
    debugProcessor

これで、カスタムプロセッサのデバッグなどを普通のプロジェクトをデバッグする時と同じようにデバッグすることができます。デバッグ設定は一度設定すれば後は変更する頻度は少ないので、コードを変更する必要のある他の手法に比べるとお手軽かもしれません。

デフォルトではプラットフォームはWindows、Debug状態の設定でビルトが行われます。プラットフォームを変更したい場合はコマンドライン引数でファイル名を指定する前にWindowsならば

/p:XnaPlatform=Windows

Xbox 360の場合は

/p:XnaPlatform="Xbox 360"

と、指定することで異なるプラットフォームでのコンテントビルドをすることができます。

デバッグ、リリースの変更は

/p:BuildConfiguration=Debug

または

/p:BuildConfiguration=Release

と、することで変更することができます。