Unityで3Dミニゲームを作る #4 音を鳴らす

投稿者: | 2019-12-04

爆発した時などに音を鳴らしてみます。

音声が聞こえるようにするには、Audio Lisenerコンポーネントが必要ですが、Main Cameraにデフォルトで付いています。

これは音声を受け取るマイクと同じです。

音声ファイルは音声素材サイトでゲットできます。
https://soundeffect-lab.info/
商用利用ができるか、クレジット表記が必要か等を確認します。

気になった音声素材をダウンロードしてUnityにインポートしました。

この音声を再生するには、Audio Sourceコンポーネントを使います。

PlayerにAdd ConponentからAudio Sourceコンポーネントを取り付けます。

Play On Awakeがオンだと、スタートと同時に音がなってしまうのでここではオフにします。

Spatial Blendのスライダーを一番右の1にすると、3Dで音の位置がわかるようになります。

今回は、ゲームが開始されたときと、マウスクリックでプレイヤーがジャンプした時、プレイヤーのCubeが飛んでくるBallにあたった時、プレイヤーが爆発したときの4つに音声をつけてみます。

音声ファイルをAudio Clipのところにドラッグアンドドロップすると音声を設定できますが、スクリプトから設定することで、複数の音声を設定することもできます。

ですが、1つのAudio Sourceで複数の音声を鳴らすと音がかぶったときに、前の音声が途中で途切れてしまうようです。

これはAudio Sourceを複数付けて音声が重ならないように割り当てることで回避できます。

スクリプトで音を鳴らす

Playerに付けたスクリプトの上部でAudio SourceとAudio Clip(音声ファイル)の配列を宣言します。

AudioSource[] playerAudio;
public AudioClip[] audio;

PlayerのインスペクタでAudio配列を横の三角形をクリックして開き、サイズを入力します。

入力した要素数の入力欄がでるので、音声ファイルをドラッグアンドドロップでアタッチします。

Audio SourceにAudio Clipを割り当てて、Audio Sourceを再生するコードを、スクリプトの音声を再生した部分に書きます。

// Start()の中(スタート時)
playerAudio = GetComponents<AudioSource>(); // Component ではなく Components
playerAudio[0].clip = audio[0]; // 1番目のオーディオソースに1番目の音声を設定
playerAudio[0].Play(); // 1番目のオーディオソースの音声を再生
//---
// if (Input.GetMouseButtonDown(0))の中(マウスの左クリックをした時)
playerAudio[1].clip = audio[1]; // 2番目のオーディオソースに2番目の音声を設定
playerAudio[1].Play(); // 2番目のオーディオソースの音声を再生
//---
// Start()やUpdate()の外(Playerが衝突したとき)
private void OnCollisionEnter(Collision collision)
{
    playerAudio[0].clip = audio[2]; // 1番目のオーディオソースに3番目の音声を設定
    playerAudio[0].Play(); // 1番目のオーディオソースの音声を再生
}

爆発音用のAudio Sourceは、爆発のパーティクルのプレハブに取り付けます。

標準アセットのExplosionを選択してインスペクタでOpen Prefabをクリックします。

Add ConponentでAudio Sourceを取り付け、AudioClipに爆発音をアタッチし、Spatial Blendを1にします。

Play On Awakeをオンにして、Explosionオブジェクトが生成されたときにAudioClipが再生されるようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class playerScript : MonoBehaviour
{
    Rigidbody rb;

    Rigidbody rb_ball;
    public Rigidbody ball;

    public GameObject explosion;

    AudioSource[] playerAudio;
    public AudioClip[] audio;


    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        StartCoroutine("ThrowTheBall"); // コルーチンを開始

        playerAudio = GetComponents<AudioSource>();
        playerAudio[0].clip = audio[0]; // 1番目のオーディオソースに1番目の音声を設定
        playerAudio[0].Play(); // 1番目のオーディオソースの音声を再生
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウスの左クリックをしたとき
        {
            playerAudio[1].clip = audio[1]; // 2番目のオーディオソースに2番目の音声を設定
            playerAudio[1].Play(); // 2番目のオーディオソースの音声を再生

            float turn = Input.GetAxis("Horizontal"); // 左右キー入力
            rb.AddForce(new Vector3(-turn/2, 1f, 0) * 5f, ForceMode.Impulse); // プレイヤーを動かす
        }

        if (transform.position.x > 9f || transform.position.x < -9f || transform.position.y > 5.5f || transform.position.y < -5f || transform.position.z > 7f)
        {          
            Instantiate(explosion, transform.position, transform.rotation); // 爆発させる
            Destroy(gameObject); // プレイヤーを削除する
        }

    }

    private IEnumerator ThrowTheBall() // Ballを生成して飛ばすコルーチン
    {
        while (true)
        {
            rb_ball = Instantiate(ball, new Vector3(Random.Range(-9f, 9f), Random.Range(-5f, 5.5f), -30f), transform.rotation) as Rigidbody;
            rb_ball.AddForce(Vector3.forward * 10f, ForceMode.Impulse);

            yield return new WaitForSeconds(Random.Range(0.1f, 1f));
        }       
    }

    private void OnCollisionEnter(Collision collision)
    {
        playerAudio[0].clip = audio[2]; // 1番目のオーディオソースに3番目の音声を設定
        playerAudio[0].Play(); // 1番目のオーディオソースの音声を再生
    }
}

コメントを残す

メールアドレスが公開されることはありません。