前回はこれまでの作品を振り返って、敵の出てくるタイミングや順番などを調整いたしました。一連の流れで「EnemyStationA」を倒すところまで出てきていると思います。それぞれの敵の強さ(HP)や速さなどを各自調整しながら、オリジナルのゲームに仕上げていってみましょう。
今回は「音」について学習していきます。では早速作っていきましょう。
1,タレットの音管理
先に、効果音を取得しておきましょう。各自好きな効果音を準備して、Projectの中に取り込めば、それだけで使うことができます。今回はアセットストアから取得します。サンプルでは「Sound FX-Retro Pack」というアセットを使ってみます。
それではプレイヤーの子要素として配置している「PlayerTurret」の効果音から作っていきます。
Unityエディタに移動して、「Player」についている2つのタレット「TurretLeft」「TurretLeft」をそれぞれ以下のように編集します。
①AudioSourceコンポーネントを追加します。
②「AudioClip」に好きな効果音をセットします。サンプルでは左右同じものを使用していますが、別々のものを使っても面白いかも。
③「Play On Awake」のチェックを外します。これを入れたままにすると、スタートと同時に1回音が発生します。
音を管理するには上でセットした「AudioSource」をプログラミングでコントロールします。[ PlayerTurret.cs ] を立ち上げて、以下のコードを追記します。
❶AudioSource型の変数を宣言。
❷宣言した変数に中身を入れます。Start関数でGetComponentでAudioSourceを指定します。
❸音を鳴らすには「AudioSource」コンポーネントの「Play」という関数を起動させます。
Update関数をでは、Zキーでミサイルを発射していますが。今回はZキーが押されたときに、その「Play」関数で1度だけ音を流しています。
AudioSource audioSource; //❶AudioSource型の変数を宣言 void Start() { shot_speed = 800; //記述済み playercontroller = GameObject.Find("Player").GetComponent<PlayerController>();//記述済み audioSource = GetComponent<AudioSource>(); //❷AudioSource の取得 } void Update() { if (Input.GetKeyDown(KeyCode.Z)) { GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation); bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed); audioSource.Play(); //❸音を1回鳴らす } if (Input.GetKey(KeyCode.D)) { transform.Rotate(new Vector3(0, 0, -playercontroller.turret_rotation_speed)); // } if (Input.GetKey(KeyCode.A)) { transform.Rotate(new Vector3(0, 0, playercontroller.turret_rotation_speed)); } }
これが一番基本の音をコントロールするプログラムになります。
2,プレイヤーの音管理
Turret と違って、Player には複数の効果音が必要になります。
1,中央から発射されるミサイル
2,Xキーで発射される爆弾
3,ダメージを受けたときの音
4,最後に爆発したときの音
これらの効果音を、AudioQlip という形で管理します。
プログラミングには「配列」といいう考え方があり、複数の値をまとめて管理することができます。変数の集合体の湯なイメージですね。
「PlayerController.cs」を立ち上げて、以下のコードを追記します。
❹は先ほどと同様、AudioSource型の変数を宣言しています。
❺AudioClip型の配列を宣言しています。配列の初期化は型の後ろに [] を指定します。
❻も上と同様、Start関数でGetComponentでAudioSourceを指定します。
AudioSource audioSource; //❹AudioSource型の変数を宣言 public AudioClip[] playerSounds; //❺AudioClip型の配列変数を宣言 void Start() { //他は省略 audioSource = GetComponent<AudioSource>(); //❻AudioSource の取得 {
ではここでスクリプトファイルの追記を中断して、エディタで配列にデータを入れていきます。
⑥Inspectorに上で作成した配列「PlayerSounds」が表示されました。
Sizeには配列の中身の数を入力します。今回は4つの効果音を使うので「4」を入力。すると4つの入力スペースができます。
それぞれのタイミングで発生する効果音をセットします。
⑦AudioSourceコンポーネントをセットして、「Play On Awake」のチェックを外します。
それでは続きのコードを追加していきましょう。
❼Shot()関数はすでに作成済みですが、スペースキーを押したときに発生する効果音を指定します。PlayOneShot()関数 の引数には、作成済みの配列の1番目の音を指定します。配列の1番目は、「playerSounds[0] 」というように、0 を指定します。
❽同様にShot()関数の、Xキーを押したときに発射される爆弾の効果音をセット。
❾Playerが爆発する動きは、コルーチンにします。すぐ破壊されると音もならないので、音が終わるまで1秒程度待ちましょう。
➓では爆発の音を発動しています。
⓫では攻撃を受けるたびに発生する音を発動
⓬は❾で作成したコルーチンを発動しています。
void Shot() { if (Input.GetKeyDown(KeyCode.Space)) { GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation); bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed); audioSource.PlayOneShot(playerSounds[0]); //❼playerSounds 0番目の音 } if (Input.GetKeyDown(KeyCode.X)&&missilePreparTime>missileTime) { Instantiate(missile, transform.position, transform.rotation); missilePreparTime = 0; audioSource.PlayOneShot(playerSounds[1]); //❽playerSounds 1番目の音 } missilePreparTime += Time.deltaTime; } IEnumerator Destroy() //❾コルーチン型関数に変更 { Instantiate(Explosion, transform.position, Quaternion.identity); audioSource.PlayOneShot(playerSounds[3]); //➓playerSounds 4番目の音 yield return new WaitForSeconds(1f); Destroy(gameObject); } void SubHP(int h) { hp -= h; HPText.text = "HP:" + hp.ToString(); audioSource.PlayOneShot(playerSounds[2]); //⓫playerSounds 3番目の音 if (hp <= 0) { StartCoroutine( Destroy()); //⓬コルーチン発動 } }
ということで、音のプログラミが完成しました。
今回はここまで。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.20までの作品は、下のVol.21 文末のリンクからどうぞ
Comments