CRIWARE Unity Plugin Manual  Last Updated: 2024-12-05
ゲーム風:ピンボール

サンプル内容

概要

ADX を使ったピンボールゲームのサウンドの実装例です。

cri4u_samples_criatom_script_game_pinball_main.png

操作方法

シーンを実行すると自動的にピンボールゲームが動き始めます。
  • [Stopper] ボタン
    クリックすると、ピンボール台の下方にストッパーが表示されてボールがロストしなくなります。

  • [Pause] / [Resume] ボタン
    一時停止ボタンです。ストッパー表示中にのみ選択できます。
    ボールの動きを一時停止/解除します。

  • [Multi Ball] ボタン
    ピンボールゲーム内にボールを追加するボタンです。ストッパー表示中にのみ選択できます。
    押した回数だけボールが増えます。

  • ピンボールの盤面をクリック
    ボールがクリックした位置に移動します。

シーン情報


ミドルウェア CRI ADX (CRI Atom)
サンプル Scriptサンプル:ゲーム風:ピンボール
格納場所 /cri/unity/samples/UnityProject/Assets/Scenes/criatom/script/GameSample_Pinball/Scenes
シーンファイル GameSample_Pinball.unity
ADXデータのオリジナル データ:ピンボール


プログラムの解説

オートプレイ操作のゲーム風ピンボールです。
ボールが壁やバンパー、ターゲットにヒットした時などの音の変化を体験してください。
音楽もボールロストするたびに雰囲気が変わるような作りになっています。

ゲーム制御とサウンド制御のスクリプト

本サンプルはゲーム制御用とサウンド制御用の二つのスクリプトから構成されています。

ゲーム制御用スクリプトファイル: GameMain/GameMain.cs
サウンド制御用スクリプトファイル: SoundManager/SoundManager.cs
GameMain.cs はStart時にSoundManagerのゲームオブジェクトを記録しておいて、必要に応じてサウンド再生指示を出します。
サウンド変化のバリエーションと比べると、SoundManager.cs がシンプルな実装になっているのがADXを使用することによるメリットの現れとも言えます。

以下では、サウンド制御についていくつかの処理を抜粋して紹介します。

ボールが壁に当たった時の音の変化

ボールが壁に当たった時の音は、衝突速度に応じて変化するようにデータ側でデザインされています。
サウンドの変化にはAISAC機能を使用しているため、スクリプト側では衝突速度をAISACのパラメータとして利用しています。
AISACの使用についてはサンプル「 [CriAtom]AISAC 」も参考にしてください。
public void PlaybackBall(int index,float velocity)
{
if(lastPlaybackBallTime+0.25 < Time.timeSinceLevelLoad){
velocity = Mathf.Min(velocity,1.0f);
atomSourceBall.SetAisac(0,velocity);
atomSourceBall.Play(index);
lastPlaybackBallTime = Time.timeSinceLevelLoad;
lastVelocity = velocity;
}
}

なお本サンプルでは、衝突音が連続して鳴り過ぎないように前回再生からの経過時間で再生判断を入れています。

ボールロスト時の音声ランダム再生

ボールをロストした場合は「うわぁぁ」とか「やられたぁ」といった音声がランダムで再生されるようにデータ側でデザインされています。
ランダム設定については全てデータ側で完結しているため、スクリプト側では再生指示以外は何もしていません。

public void PlayGameOver()
{
//atomSourceSe.Play(4); // by Cue ID
atomSourceSe.Play("GameOver"); // by Cue Name
}

バンパーやターゲットにヒットした音などにもエフェクトがかかっていますが、全てデータ側で設定が完結しているためスクリプト側は特別なパラメータ設定は何もしていません。

ボールロスト時の音楽音量変化

ボールをロストして「うわぁぁ」などのセリフが再生された時に、音楽の音量が一時的に下がるようになっています。
これはセリフを目立たせるための演出です。
音楽の音量変化についてはREACT機能を使って全てデータ側で完結しているため、スクリプト側では再生指示以外は何もする必要はありません。
REACT機能についてはサンプル「 [CriAtom]カテゴリ 」も参考にしてください。

音楽の変化

ボールをロストした回数によって音楽が変化するようにデータ側でデザインされています。
音楽の変化にはブロック再生の機能を使用しているため、スクリプト側ではボールロスト時に現在再生しているブロック位置を調べて、次に再生するブロック位置を指定するようにしています。
ブロック再生の使用についてはサンプル「 [CriAtom]ブロック再生 」も参考にしてください。
public void PlayBGM()
{
bool startFlag = false;
CriAtomSource.Status status = atomSourceBgm.status;
if ((status == CriAtomSource.Status.Stop) || (status == CriAtomSource.Status.PlayEnd)) {
this.playbackBGM = atomSourceBgm.Play(100);
startFlag = true;
}
/* 初回再生以外ならブロックをすすめる */
if(startFlag == false){
int cur = this.playbackBGM.GetCurrentBlockIndex();
CriAtomExAcb acb = CriAtom.GetAcb("PinballMain");
if(acb != null){
acb.GetCueInfo("BGM",out this.cueInfo);
cur++;
if(this.cueInfo.numBlocks > 0){
this.playbackBGM.SetNextBlockIndex(cur % this.cueInfo.numBlocks);
}
}
}
}

音楽のリスタート制御について

SoundManager.cs の中に「音楽が停止していたら再生開始する」という処理が入っています。

public void ResumeBGM()
{
/* Play if the status is in the PlayEnd or the Stop. (automatically restart when ACB is updated) */
CriAtomSource.Status status = atomSourceBgm.status;
if ((status == CriAtomSource.Status.Stop) || (status == CriAtomSource.Status.PlayEnd)) {
/* Play */
PlayBGM();
}
}
これはゲーム自体にとっては不要な処理ですが、ADXのインゲームプレビュー機能を使うために入っている処理です。
インゲームプレビュー機能とは実行中のゲーム(この場合はピンボール)に、CRI Atom Craft から接続して、ゲームを動かしたままで音の調整を行う機能です。例えばエコーのかかり具合とか、各ヒット音のボリューム調整などがゲームを動かしながら調整できます。
インゲームプレビューのためにCRI Atom Craft からゲームプログラムに「接続」した場合、一時的に全ての音声再生が停止されます。
効果音はゲームから必要に応じて再生指示が出るので停止しても問題ありませんが、音楽は停止したあと自動的には再開されません。
それではインゲームプレビューの目的が十分に達成できませんので、SoundManager側でリスタートをかけているというわけです。
インゲームプレビュー機能についてはサンプル「 [CriAtom]インゲームプレビュー(ピンボールデモ) 」も参考にしてください。
本サンプルもインゲームプレビューに対応しています。サンプル「 データ:ピンボール 」を CRI Atom Craft で開けば、本サンプルでのインゲームプレビューが体験できます。