XNAを使用したシンプルな3Dゲームの作成/サウンド

出典: フリー教科書『ウィキブックス(Wikibooks)』

サウンドの準備[編集]

XNAでのサウンドエフェクトの使用は少し長いったらしいので、外部アプリケーションとして、XACTツール(XNAのスタートメニューフォルダのtoolsフォルダで利用可能)が必要になり、 プロジェクトで使用する前にサウンドファイルを'cue'ファイルにする処理が必要になります。 '.Wav' ファイルを直接コード内で再生することもできますが、後述のような音の属性を調整できるという利点は失われます。 XACT v3を開くと、次の画面が表示されるはずです。

ファイル:XNA XACT opening screen.gif

このプロジェクトでは、2つの効果音使用していき、これは魚と衝突するたびに再生されるオープンライセンスの効果音ファイルと、ループする音楽ファイルで、取得元の Newgrounds Audio Portalは、インディーズゲームのための優れたリソースであり(Xboxのアーケードで利用できる 'Castle Crashers' というゲームは、このウェブサイトからすべての音楽をとってきている)、自由な使用ができます。 どちらもメインページに完全なサンプルが用意されています。 注意点として、サウンドは使用する前に '.Wav'ファイルに変換しなければならず、これにはオーディオ変換ユーティリティの dBpowerampを使用します。

ロードされるそれぞれの音は 'Wave Bank'の中に格納され、ここには実行時にプログラムによってストリーミングされる生のオーディオデータが保持されます。 これらのファイルを再生する方法の命令は、その後、 'Sound Bank'の中に格納され、これには 'Sounds'という再生する各音のプロパティを保有するものが含まれ、そして 'Cue'はプログラムの中で参照されます。

新しいプロジェクト(私の場合は'FishSounds'という名前にした)を作成し、画面の左側で 'Wave Banks' タグを右クリックし、そして 'New Wave Bank'を選択します。 新しいWave Bankを右クリックし、 'Insert Wave Files'を選択し、2つのwaveファイルを開きます。

次に、Sound Bankを右クリックし、新しいものを作成します。 新しいbankを右クリックして、二つの新しい 'Sounds'を作成し、 ひとつを 'Effect'という名前にし、もうひとつを 'Music'と名付けます。 'Wave Bank' からそれぞれの 'Sound Banks'にエントリをドラッグします。 新しい 'Sound Banks'のいずれかを選択すると、オプションのセットが左側に見えます。 ここで本当に心配する必要があるものは、先頭付近の 'Looping'/'Infinite' チェックボックスだけで、他はどれでもお気軽に調整して味見してかまいません。 'Music'サウンドをクリックして、チェックボックスを下図のようにクリックします。

ファイル:XNA XACT check box.gif

2つの新しいキューをsoundsと同じ方法で作成し、前と同じように 'Effect' と 'Music'とリネームし、それぞれの 'Sound'をそれらの中にドラッグします。

さて、プロジェクトを保存し、ゲームのプロジェクトに戻ります。 'Content' フォルダを右クリックし、新しく作成した 'FishSounds.xap' プロジェクトファイルを追加します。

以下の3つの新しいクラス変数を作成します。

AudioEngine audioEngine;
WaveBank waveBank;
SoundBank soundBank;

そして、 'LoadContent()' メソッドに次の行を。

audioEngine = new AudioEngine("Content\\FishSounds.xgs");//The new audio project
waveBank = new WaveBank(audioEngine, "Content\\Wave Bank.xwb");//The name of the Wave bank
soundBank = new SoundBank(audioEngine, "Content\\Sound Bank.xsb");//The name of the Sound bank

この時点でコードをコンパイルし、効果音が見つからないというエラーメッセージが現れた場合は、 XACTで '.Wav' ファイルのパスを変更します。

さて、バックグラウンドミュージックを再生するために、上記の初期化コードの後に直接​​次の行を挿入します。

soundBank.PlayCue("Music");

そして、衝突検出コードを次のように変更します。

if (CheckCollision(FishMen.Translation, OtherFishes[i].Translation)
&&
OtherFishes[i].clip == OtherFishes[i].skinningData.AnimationClips["Frown"])
{
    OtherFishes[i].PlayAnimation("Smile");
    soundBank.PlayCue("Effect");
}

今コードを実行すると、フルに機能するサウンドシステムができているはずです。