シニア オーディオ スペシャリスト、Scott Selfon 著
ゲーム ディベロッパー グループ
はじめに
Microsoft クロスプラットフォーム オーディオ作成ツール (XACT) には、コンテンツ作成者が、Windows および Xbox 360 タイトル用のオーディオ アセットをオーサリング、視聴、および配布できる強力なツールが用意されています。しかし、複数のアーティストが同じタイトルに関する作業を同時に行う場合はどうでしょうか。ここでは、共同作業の実践ガイドを紹介するとともに、ゲーム開発キット (GDK) および Xbox 360 開発キット (XDK) の June 2006 リリースから導入された "共有設定" のサポートについて詳しく説明します。
プロジェクト結合による共同作業
コンテンツ作成者が同じコンテンツの作業を同時に行っている場合、プログラマがソース コードを共有する際に発生する問題と同じ問題に直面します。2 人のコンテンツ作成者が同じアセットを同時に編集する際、変更を非常に厳密に行う必要があります (つまり、一方の変更が終了するまで、もう一方の変更は開始できません)。また、変更を結合し、競合を処理するプロセスが必要になります。XACT にはこれらの問題を解決する方法がいくつか用意されていますが、コンテンツ作成者はまず、プロジェクト結合による共同作業の方法について理解する必要があります。
プロジェクト結合は複数のプロジェクトを 1 つのプロジェクトに結合できる XACT の機能で、1 つのタイトル用のすべてのコンテンツ (特に共有グローバル設定ファイル) を一度にビルドできます。これにより、オブジェクト参照の競合、コンテンツの日付やバージョンの不一致のような問題を回避できます。プロジェクト結合は、複数のコンテンツ作成者が同時にコンテンツをオーサリングするための綿密なプロセスに代わるものとしては設計されていません。競合するデータを処理するための簡潔な "結合" 機能が提供されるわけではなく、単に複数のプロジェクトを 1 つのプロジェクトにまとめる方法です。
コンテンツ作成者が効率的に共同作業を行うために、いくつかの作業ガイドラインに従うことをお勧めします。まず、複数のコンテンツ作成者が全く同じプロジェクトファイル (.xap) に対して、別々のマシンを使用して同時に作業することは絶対に避けてください。どちらかが "保存" を行うと、もう 1 人の変更が取り消されてしまいます。また、多くのオブジェクトはインデックス ベースであるため、ソース管理システム内であっても、一般的なプログラミング ツールで使用される種類の結合は正常に実行されません。
コンテンツ作成者が、完全に独立した単独のコンテンツの作業を行う場合は、別のプロジェクトで作業して後からそのプロジェクトを結合することもできます。プロジェクトを結合するには、次の 2 つの方法があります。
- コマンドラインの XACT プロジェクト ビルド ツール xactbld.exe を使用して実行するジャストインタイム方式では、複数のプロジェクトを一度に結合できるため、ランタイム コンテンツを生成できます。結合された XACT プロジェクトは保存されません。また、コンテンツの競合が発生すると、ビルドが失敗します。
- オーサリング ツールでは、[ファイル](File) メニューの [プロジェクトのインポート](Import Project) をクリックします。この場合、プロジェクトのサウンド バンク、ウェーブ バンク、変数、カテゴリなどを含むプロジェクト全体が現在開いているプロジェクトに結合され、このプロジェクトを他のプロジェクトと同様に保存できます (たとえば、第 3 の場所への保存や、結合した 2 つのプロジェクトのどちらかの上書き保存が可能です)。
XACT で競合が発生する状況
コンテンツの有効な "結合" が難しい競合が発生する可能性は多数あります。たとえば、別々のプロジェクトの 2 つのウェーブ バンクが同じ名前とパスを共有している場合、共存させるにはどちらか 1 つまたは両方を変更する必要があります。また、一方のプロジェクトのグローバル設定にもう一方のプロジェクトと同じ名前のカテゴリまたは変数が含まれている場合、それらがまったく別の目的で使用されていたとしても、XACT にはこれらのオブジェクトを区別する方法がないため、ユーザーがどちらかを変更する必要があります。
さらに、すべての XACT プロジェクトには、Default カテゴリ、Music カテゴリ、SpeedOfSound 変数、Distance 変数のように必ず存在する、いわゆる "暗黙的な" カテゴリと変数があります。これらのオブジェクトのプロパティが一方のプロジェクトで変更され、もう一方では変更されていない場合、プロジェクトの結合時に競合を解決する必要があります。
ソーシャル ワーカーの役割を果たす XACT : オブジェクト競合の解決
オブジェクトをあるプロジェクトにインポートしたときに、それらのオブジェクトが既存のオブジェクトと競合する場合、ユーザーは XACT で競合を解決する方法を決定する必要があります。XACT では通常、インポートされるオブジェクトの名前空間またはプロパティに競合が存在する場合、競合の解決方法として複数の選択肢が提示されます。
- インポートされるオブジェクトで既存のオブジェクトを置き換える (GUI が "結合" を呼び出します)。
- インポートされるオブジェクトを無視する (つまり既存のオブジェクトがそのまま残ります)。
- 既存のオブジェクトの名前を変更し、インポートされるオブジェクトはプロジェクトに追加される。この場合、既存のオブジェクトを参照するオブジェクトは、インポートされるオブジェクトを使用するようになります。これは、上記の 1 に非常に似ています。
2 つのプロジェクトを結合する場合に両方のプロジェクトに "Guns" というカテゴリがあると、[結合競合](Merge Conflict) ダイアログ (図 1) が表示されます。[結合](Merge) は上記の選択肢 1、[無視](Ignore) は選択肢 2、[名前の変更](Rename) は選択肢 3 に該当します。また、[中止](Abort) を選択して、結合をキャンセルすることもできます。
図形 1. [結合競合](Merge Conflict) ダイアログ
競合しているオブジェクトを処理する場合、(一方のボリューム プロパティともう一方のインスタンス制限プロパティというように) 競合しているオブジェクトの個々のプロパティを個別に解決しないようにしてください。XACT の [結合競合](Merge Conflict) ダイアログは、コンテンツの検証およびエラー チェック メカニズムとしても設計されています。単なる高性能な結合ツールではありません。このため、サウンド デザイナーと作曲家は前もって可能な限り競合を少なくする必要があります。[結合競合](Merge Conflict) ダイアログに依存して、複雑なオブジェクト競合を解決するべきではありません。
共有設定を使用した共有について
プロジェクト結合は最終的なコンテンツ制作のための優れた方法ですが、共同作業においては、プロジェクト結合が最適な解決策ではない場合もあります。まず、コンテンツ作成者がプロジェクトの結合後にもコンテンツでの作業を続けたい場合があります。しかし、プロジェクトを結合すると、別のプロジェクトに簡単に再抽出することはできません。また、複数のコンテンツ作成者がオーバーラップするデータ セットで作業する必要がある場合、すべてのサウンド エフェクトが使用する (複数のサウンド デザイナーのプロジェクトにまたがる) 距離関連のプロパティが存在する可能性があります。あるいは、すべてのサウンド用のグローバル カテゴリがある場合もあります。このような場合、プロジェクト結合は理想的な解決策ではありません。編集可能な単一の場所に共有するオブジェクトを保存し、これらのオブジェクトが変更された場合に、オブジェクトを使用するすべてのプロジェクトで変更を確認できるようにする方法が、より望ましい方法です。このため、June 2006 GDK および XDK リリースでは、XACT に共有設定のインポートおよびエクスポートの概念が導入されました。共有設定は、実行時に共有される単一の XACT グローバル設定ファイル (.xgs) に含まれるすべてのオブジェクトに対応します。特に、共有設定は以下のすべてのオブジェクトで構成されます。
- カテゴリ
- 変数
- ランタイム パラメーター制御 (RPC) プレセット
- DSP エフェクト パス プリセット
- 圧縮プリセット (これらの設定は、実際には最終的にこれらを使用するウェーブ バンクに書き込まれますが、プリセットそのものは XACT プロジェクト ファイルに含まれるため "共有" されます)
これらの設定は、[ファイル](File) メニューの [共有設定のエクスポート](Export Shared Settings) をクリックすると、プロジェクトから通常の XACT プロジェクト ファイルにいつでもエクスポートできます。しかし、これらの設定のエクスポートの繰り返しより、"クライアント" プロジェクトによるインポートの方が頻繁に行われます。共有設定を使用する作業を管理する場合の一般的な推奨事項が 2 つあります。
- すべてのサウンド デザイナーがアクセスする共有設定プロジェクト ファイルは単一のものにすること。
- 1 人のサウンド デザイナーのプロジェクトを "マスター" プロジェクトにして、共有設定に対する変更が必要な場合は必ずこのサウンド デザイナーに通知し、マスター プロジェクトに対して実行すること。
XACT プロジェクトの典型的な共同作業構成 (図 2 を参照) では、単一の共有設定ファイルを 3 人のコンテンツ作成者が使用し、各自が同一または別々のグローバル オブジェクトを使用して個別に作業できます。次に、プログラマがゲームのビルド プロセスの一環として 3 つのプロジェクトを結合します (一般的に xactbld.exe ツールが使用されます)。このツールは、タイトルに実際に展開されるコンテンツの作成に使用されます。
図形 2. XACT プロジェクトの典型的な共同作業構成
[ファイル](File) メニューの [共有設定のインポート](Import Shared Settings) をクリックすると、必要に応じて共有設定を同期できます。このとき、グローバル設定に読み込まれる XACT プロジェクトを指定できます。([ファイル](File) メニューの [プロジェクトのインポート](Import Project) をクリックして実行できる) 結合機能とは異なり、共有設定のみがインポートされ、ウェーブ バンクおよびサウンド バンクはこのプロジェクトに取り込まれません。
便宜上、共有設定は各プロジェクトのロード時に自動的に読み込むことができます。[表示](View) メニューの [オプション](Options) をクリックすると、この機能を有効にするチェックボックスが表示されます。
このプロジェクトの共有設定ファイルの場所をプロジェクトのプロパティ フレームに入力できます (プロパティ フレームはプロジェクト ツリーでプロジェクト ノードを選択すると表示されます)。
図形 3. 共有設定プロジェクトのファイル名およびパスのプロジェクト フレーム入力。
ファイル名 (パスがローカルでなく、よく使う "ネットワーク プレース" でもない場合は、パスも) は手動で入力する必要がありますが、これは通常は最初の一度だけです。これにより、[プロジェクトのロード時に共有設定を同期する](Synchronize shared settings on project load) チェックボックスがオンになっている場合は共有設定の読み込みが試され、ローカル設定と共有設定が異なると結合競合情報が表示されます。
共有設定の更新の管理
共有設定を別のファイルに保存しておくと、制作過程で不注意な変更が行われたことにより競合が発生するのを防止できます。ただし、共有設定に対して計画的に更新を実行する明確に定義されたプロセスが推奨されます。XACT の共有設定プロジェクト (他のすべての XACT プロジェクトも同様に) を使用するコンテンツ作成者およびプログラマは、コンテンツの複数の部分が参照するコンテンツを編集する場合に特に注意を要するだけではなく、タイトルに対して実行された変更を追跡できる履歴とバージョン管理機能を備えた、優れたソース管理システムを開発する必要があります。
コンテンツ作成者が共有設定プロジェクトファイルを編集する方法はいくつかあります。
- 他の XACT プロジェクトと同様に、XACT オーサリング ツールを使用して手動で開いて編集できます。1 人のコンテンツ作成者のプロジェクトを "マスター" とする場合 (つまり、あるプロジェクトの共有設定にウェーブ バンクとサウンド バンクも含まれる場合)、マスターのプロジェクトを開いて、設定を変更し、そのプロジェクトを保存することになります。
- [ファイル](File) メニューの [共有設定のエクスポート](Export Shared Settings) をクリックして、いずれかのコンテンツ作成者のプロジェクトから変更点を含むファイルをエクスポートし、共有設定の新しいバージョンを作成できます。次に、このファイルをチェック インして前のバージョンと置き換えます。注意事項は次のとおりです。
- 新しい共有設定ファイルを作成した場合は必ず、最新の共有設定を使用していることをサウンド デザイナーが確認する必要があります (通常は、既存の共有設定プロジェクトのインポートが実行されます)。
- 前に説明した上書きと同じような結合の問題が発生しないように、複数のサウンド デザイナーが同時に共有設定を変更してはなりません。
- ローカル プロジェクトを使用する共有設定ファイルの更新は、このプロジェクトのすべてのグローバル設定が共有設定ファイルに含まれている場合にのみ実行できます。つまり、あるサウンド デザイナーがプロジェクト固有の圧縮プリセットまたは RPC のようなオブジェクトを作成し、すべてのサウンド デザイナーがこれを使用することを前提としていない場合、1 の方法が代わりに使用されます。
共有設定の更新後、すべてのコンテンツ作成者に新しい共有設定をインポートするよう通知する必要があります (プロジェクトを次回開いたときに自動的に更新されるか、[共有設定のインポート](Import Shared Settings) を使用して手動で更新します)。
結果の確認
複数のプロジェクトで共有するリソースがある場合、これらのプロジェクトを編集するコンテンツ作成者は、編集によって "ビルドが破壊" されないことを確認するプロセスを開発する必要があります。編集とビルドが破壊されないことを確認するプロセスは、次のような手順で行います。
- コンテンツ作成者が作業しているプロジェクトに共有設定をインポートします (前に説明したように、これは自動で実行できます)。
- プロジェクトで作業や変更を行います。
- プロジェクトをローカルで保存します。
- 次のどちらかを実行して、コンテンツの結合競合が発生していないことを確認します。
- ゲームで使用するものと同じスクリプトを使用して xactbld.exe を実行します。競合がある場合はツールによってユーザーに対して警告が表示され、失敗します。
- 保存したプロジェクトに共有設定を再度インポートします。[結合競合](Merge Conflict) ダイアログに競合が表示されます。
- 競合がある場合には、ローカルのプロジェクトで修正します。あるいは、他のすべてのコンテンツ作成者の同意を得らえた場合は、共有設定プロジェクトを変更します。
- プロジェクトで確認します。
このプロセスは、ソフトウェア開発のテスト ビルド (開発者コード、ビルド、および主プロジェクト リポジトリへの変更送信前のローカルでの変更テスト) に似ています。このように、開発者は、自分が行った変更をチェック インする前に、他の開発者に悪影響を及ぼさないかを確認できます。
結合競合に関するその他の問題
共有設定のインポートでは、行動データ (たとえば、変数に対して保存された "最新の" 値) に影響を与えない競合が検出されることはありませんが、ランタイム パラメーター制御やカテゴリ ボリュームなどの多くのオブジェクトが思わぬ競合の原因になる場合があります。これらの競合は [結合競合](Merge Conflict) ダイアログの表示ではわかりにくい可能性があります。
たとえば、ランタイム パラメーター制御を操作している場合に、カーブ ポイントを少し調整しただけで、次のインポート時に競合が発生する可能性があります。これは、直前の位置のポイントを返すために必要な微調整の方法がないためです。同様に、コンテンツの視聴時にカテゴリ ボリュームを調整すると、変更が元の位置に返されない場合は、一般的にインポート時に競合が発生します。どちらの場合にも、一般的に [結合](Merge) を選択して、編集した値を共有設定値と置き換えます。
この他の結合に関する問題には、Distance および SpeedOfSound 変数があります。Distance および SpeedOfSound には、プロジェクトでの最大値が非常に大きくなる場合があるという既知のバグがあります (通常はプロジェクト作成時のみ)。コンテンツ作成者は、共有ファイルを他の XACT プロジェクトに結合する前、および Distance 変数を使用するランタイム パラメーター制御を作成する前に、共有設定ファイル内のこれらの変数の最大値が妥当な値であることを確認する必要があります。確認しない場合、共有設定の結合を行った際に距離に関係する RPC 曲線のスケーリングが意図せず調整される可能性があります。
まとめ
XACT のプロジェクト結合と共有設定によって、一般的に大規模なゲーム制作 (複数のオーディオ コンテンツ作成者による共同作業制作) で重要なコンポーネントを準備できます。これらのプロジェクトの共同作業テクニックを使用しても、データ競合が発生する可能性があるため、次の点を熟考したプロセスを確立する必要があります。
- 共有設定ファイルの更新 : 一度にファイルを編集できるのは 1 人のみとし、後で予期せぬ問題が発生しないようにすべての変更について通知すること。また、予期せぬ変更を取り消すことができるように、バージョン管理と履歴機能を備えた十分に安全な制御システムを使用すること。
- 共有設定変更時のプロジェクトの更新 : これを実現する最も便利な方法は、通常、プロジェクトが開かれたときに必ず共有設定を自動インポートするオプションです。
- 最終的なアセット ビルドおよび配布のためのプロジェクト結合の管理 : オーディオ コンテンツ作成者は、自分のオブジェクト内で名前の競合が発生していないことを確認する必要があります。また、実際にはプロジェクトに対してローカルな "グローバル" 設定が使用されている場合は、他のコンテンツ作成者の設定と競合が発生しないことを確認する必要があります。
共有設定は可能な限り XACT の外部に配置し、連携がとりやすく、優れたポリシーを備え、すべてのオブジェクトの "所有権" が明確に定義された環境で管理する必要があります。オーサリング ツールの主な役割は、連携がとれていない状況を把握して、これをコンテンツ作成者が修正できるようにすることです。ソフトウェア開発の "テスト ビルド" と同様のプロセスやポリシーなど、さまざまなデータ管理テクニックを使用することにより、大勢のアーティストが単一のプロジェクトで同時に問題なく作業できます。