●はじめに
今回のメインはオーディオです。
2D横スクロールシューティング作成の3回目になります。
アセットストアで無料公開されている「Warped Space Shooter」をお借りして作成しています。
「自機のやられ、BGM再生、効果音再生」を作成し、シューティングっぽくなるようにします。
↑これが完成する。
●自機のやられ
▷自機の衝突設定
・解説
Hitスクリプトを設定し、1撃でやられるようEnergyに(1)を設定します。
Rigidbody2Dを割り当てて重力スケールを(0)、衝突判定を(連続的)とし、
CircleCollider2Dを割り当ててオフセットXを(0.05)、半径を(0.05)とします。
・手順
スクリプトを割り当てます。
- 「Assets>Hit」をヒエラルキーの「Player1」にドラッグ&ドロップ
- インスペクターの「Hit (スクリプト)>Energy」に(1)を入力
Rigidbody 2Dを割り当てます。
- インスペクターの「コンポーネントを追加」をクリック
- 「Physics 2D>Rigidbody 2D」をクリック
- インスペクターの「Rigidbody 2D>重力スケール」に(0)を入力
- インスペクターの「Rigidbody 2D>衝突判定」を(連続的)に変更
Circle Collider 2Dを割り当てます。
- インスペクターの「コンポーネントを追加」をクリック
- 「Physics 2D>Circle Collider 2D」をクリック
- インスペクターの「Circle Collider 2D>トリガーにする」をチェック
- インスペクターの「Circle Collider 2D>オフセット>X」に(0.05)を入力
- インスペクターの「Circle Collider 2D>半径」を(0.05)に変更
・動作確認
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
- 敵に体当たりしたら自機が爆発することを確認
- 自機が爆発したら自機の弾が停止するバグが発生することを確認…
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了
▷弾を加速度で動かす
・解説
弾が停止しないよう弾にRigidbody2Dを割り当てて加速度を与え、自分で動くようにします。
・手順
- プロジェクトの「Assets>Player」をダブルクリック
- Start関数の繰り返し処理内にある「プレハブから弾を作成」の処理の後に以下の処理を追加
// リジッドボディの加速度を指定
Rigidbody2D rb = shotList[i].GetComponent<Rigidbody2D>();
rb.velocity = transform.right * shotSpeed;
- FixedUpdateの最後にある「弾移動(どうせ見えないので全部動かす)」処理を削除
スクリプトを保存してビルドします。
- CTRLを押しながらSキーを押してスクリプト保存
- Unityエディタをクリックしてビルド
弾にRigidbody 2Dを設定します。
- プロジェクトの「Assets>shoot1」をダブルクリック
- インスペクターの「コンポーネントを追加」をクリック
- 「Physics 2D>Rigidbody 2D」をクリック
- インスペクターの「Rigidbody 2D>重力スケール」に(0)を入力
- インスペクターの「Rigidbody 2D>衝突判定」を(連続的)に変更
- ヒエラルキー左上の「<」をクリックしてプレハブ編集を終了
動作を確認します。
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
- 敵に体当たりして爆発しても弾が停止しないことを確認
- 自機の弾に体当たりしても爆発することを確認
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了
▷タグで衝突を制御
・解説
自機の弾は誰と衝突しても破壊できる状態です。
自機と自機の弾にPlayerタグを割り当て、自分と同じタグの場合は衝突しないようスクリプトを修正します。
・手順
自機のタグを「Player」にします。
- ヒエラルキーの「Player1」をクリック
- インスペクターのタグを「Player」に変更
自機の弾のタグを「Player」にします。
- プロジェクトの「Assets>shoot1」をダブルクリック
- インスペクターのタグを「Player」に変更
- ヒエラルキー左上の「<」をクリックしてプレハブ編集を終了
タグが同じ場合は衝突しないように条件を追加します。
- プロジェクトの「Assets>Hit」をダブルクリック
- OnTriggerEnter2D関数の先頭に以下の処理を追加
// タグが同じ場合は衝突させない
if (tag == collider.gameObject.tag) {
return;
}
- CTRLを押しながらSキーを押してスクリプト保存
- Unityエディタをクリックしてビルド
プロジェクトを保存して、
- CTRLを押しながらSキーを押してプロジェクト保存
動作を確認します。
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
- 敵に弾を当てて倒せることを確認
- 自分の弾に当たっても爆発しないことを確認
- 再度プレビューし、敵への体当たりで爆発することを確認
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了
●オーディオ制御
▷BGM設定
・解説
オーディオ機能を使ってBGMを鳴らします。
・手順
BGMに合ったインポート設定に調整します。
- プロジェクトの「Assets>Space Shooter Assets>Artwork>music>space-asteroids.ogg」をクリック
- インスペクターの「バックグラウンドで実行」をチェック
- インスペクターの「デフォルト>ロードタイプ」を「ストリーミング」に変更
- インスペクターの「適用する」をクリック
ヒエラルキーに配置してBGM再生します。
- プロジェクトの「Assets>Space Shooter Assets>Artwork>music>space-asteroids.ogg」をヒエラルキーにドラッグ&ドロップ
- F2キーを押して「BGM」と入力し、ENTERを押す
- インスペクターの「Audio Source>ループ」にチェックを入れる
・動作確認
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
- BGMが再生されることを確認
- BGMがループすることを確認
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了
▷効果音再生制御
・解説
効果音を再生するためのスクリプトを作成します。
効果音再生にはオーディオ機能だけでなく、スクリプトも必要になります。
・手順
効果音を3つ、効果音に合ったインポート設定に調整します。
- プロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>explosion」をクリック
- SHIFTを押しながらプロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>shot 1」をクリック
- インスペクターの「Mono に強制」をチェック
- インスペクターの「適用する」をクリック
ヒエラルキーに効果音を配置し、開始時に再生しないように設定します。
- プロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>explosion」をクリック
- SHIFTを押しながらプロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>shot 1」をクリック
- プロジェクトで選択中のアセットをヒエラルキーの「Sample Scene」にドラッグ&ドロップ
- インスペクターの「Audio Source>ゲーム開始時に再生」にあるチェックを外す
- インスペクターの「Audio Source>ボリューム」を(0.5)に設定
- ヒエラルキーで選択中のゲームオブジェクトをヒエラルキーの「GameController」にドラッグ&ドロップ
ゲーム管理にオーディオソースを管理させます。
- プロジェクトの「Assets>GameController」をダブルクリック
- Start関数の前に以下の変数を追加
// オーディオソース一覧
public List<AudioSource> audioSrcList = new List<AudioSource>();
ゲーム管理に効果音再生の機能を追加します。
- playEffect関数の次に以下の関数を追加
// 効果音再生
public void playSE(string clipName)
{
// オーディオクリップ一覧から指定されたと一致するオーディオクリップを取得
AudioSource audioSrc = audioSrcList.Find(item => item.clip.name == clipName);
// オーディオクリップが見つかった場合
if (audioSrc != null)
{
// オーディオ再生
audioSrc.Play();
}
}
- CTRLを押しながらSキーを押してスクリプト保存
- Unityエディタをクリックしてビルド
命中した時に効果音を再生します。
- プロジェクトの「Assets>Hit」をダブルクリック
- 命中エフェクト再生の前に以下の処理を追加
// 命中音再生
gameController.playSE("hit");
爆発した時に効果音を再生します。
- 爆発エフェクト再生の前に以下の処理を追加
// 爆発音再生
gameController.playSE("explosion");
- CTRLを押しながらSキーを押してスクリプト保存
- Unityエディタをクリックしてビルド
弾を発射した時に効果音を再生するため、Playerスクリプトを修正します。
- プロジェクトの「Assets>Player」をダブルクリック
- Start関数の前に以下の処理を追加
GameController gameController; // ゲーム管理オブジェクト
- Start関数の最後の処理として以下を追加
// ゲーム管理オブジェクトを取得
GameObject[] gameObjects = GameObject.FindGameObjectsWithTag("GameController");
gameController = gameObjects[0].GetComponent<GameController>();
- FixedUpdate関数内の「発射効果を表示」の前に以下の処理を追加
// 発射音再生
gameController.playSE("shot 1");
- CTRLを押しながらSキーを押してスクリプト保存
- Unityエディタをクリックしてビルド
プロジェクトを保存して、
- CTRLを押しながらSキーを押してプロジェクト保存
動作を確認します。
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
- 弾発射のタイミングで発射音が再生されることを確認
- 弾が敵に命中した時に命中音が再生されることを確認
- 弾が爆発した時に爆発音が再生されることを確認
- Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了
●完成
敵にやられ、BGMと効果音も再生されるようになりました。
スコアは表示できませんでしたが、だいぶシューティングっぽくなったかな?
次回は「スコア表示、アステロイド作成」を実施しようと思います。
コメント