【Unity 2020】複数の音を使い分けて鳴らす方法

Rebuild Factoryzの礒です。
今回は地道に進めているUnityでのVR作成で、少しつまづいた複数のSEを鳴らす方法について書いていきたいと思います。

もう完全に備忘録として書きます。


動画

環境

今回の目標は、ずばり「ドアの開閉に合わせて音を鳴らしたい」です。

今回利用した環境で関係しているのは、ドアとボックスコライダー、プレイヤーの3つですね。
あとはカメラとかいろいろくっついてますが、要は「プレイヤーがボックスコライダーに入ったり出たりしたときにドアが回転する」です。

ドアのトリガーとしてヒエラルキーにDoorTriggerにボックスコライダーとDoor Openというドアの開閉スクリプトをつけてます。

実際の動作は動画でご確認ください。

次はプログラムの詳細に移りたいと思います。

プログラム

以下のコードがDoor Openの中身です。
これ以降は一部を抜粋する形で解説していきます。

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorOpen : MonoBehaviour
{
    //回転させるオブジェクト指定
    public GameObject RotateObj;
    private Vector3 axis = new Vector3(0.3f, 0.0f, -1.4f);

    //AudioSource変数を2つ用意、インスペクターで音声を登録
    [SerializeField]
    private AudioSource openSE;
    [SerializeField]
    private AudioSource closeSE;



    // Start is called before the first frame update
    void Start()
    {
        //デバッグ用のメッセージを設定
        if(openSE == null)
        {
            Debug.Log("openSE has not been set...");
        }

        if(closeSE == null)
        {
            Debug.Log("closeSE has not been set...");
        }

    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void OnTriggerEnter(Collider other)
    {
        //ドアを開けるのと同時に開く音を鳴らす
        RotateObj.transform.RotateAround(axis, Vector3.up, -90);
        openSE.Play();
    }

    private void OnTriggerExit(Collider other)
    {
        //ドアを閉めるのと同時に閉じる音を鳴らす
        RotateObj.transform.RotateAround(axis, Vector3.up, 90);
        closeSE.Play();
    }

}

変数宣言

回転させるオブジェクトと回転軸も用意していますが、ここは触れずに。

    public GameObject RotateObj;
    private Vector3 axis = new Vector3(0.3f, 0.0f, -1.4f);

    //AudioSource変数を2つ用意、インスペクターで音声を登録
    [SerializeField]
    private AudioSource openSE;
    [SerializeField]
    private AudioSource closeSE;

大事なのは「private AudioSource openSE」と「private AudioSource closeSE」の宣言ですね。

一応privateで宣言しましたが、今思えばpublicでもよかったかも。

[SerializeField]でインスペクターで音声を登録できるようにしています。

デバッグ用のコード

   void Start()
    {
        //デバッグ用のメッセージを設定
        if(openSE == null)
        {
            Debug.Log("openSE has not been set...");
        }

        if(closeSE == null)
        {
            Debug.Log("closeSE has not been set...");
        }

    }

これは簡単なコードだと思いますが、音声用に用意した変数に何も入ってなければ、「何も入ってないよ」とログを流すようにしてあります。

ボックスコライダーとSE

ここが大事な部分です。
ボックスコライダーにプレイヤーが入ったときと出たときのプログラムです。

    private void OnTriggerEnter(Collider other)
    {
        //ドアを開けるのと同時に開く音を鳴らす
        RotateObj.transform.RotateAround(axis, Vector3.up, -90);
        openSE.Play();
    }

    private void OnTriggerExit(Collider other)
    {
        //ドアを閉めるのと同時に閉じる音を鳴らす
        RotateObj.transform.RotateAround(axis, Vector3.up, 90);
        closeSE.Play();
    }

まあ見るとわかりますが、かなりシンプルです。
「openSE.Play()」でインスペクターで登録する音を鳴らします。
「closeSE.Play()」で同じくインスペクターで登録する音を鳴らします。

以上です。


・・・え?とお思いのあなたへ、

これがすべてです。

僕がドアの開閉に音を鳴らしたいなと思ったとき、複数の音源を扱うにはどうしたらいいのかググりまくって、結果英語圏で見つかったものを活用させてもらいました。

では、これでひとまず終わりとさせていただきます。

投稿者: 礒

建築3DCGモデラーの礒です。 アラサーでアスペルガー症候群とADHD、双極性障害、解離性障害(記憶障害)を持っています。障害を持っているとは思っていなかった少年時代はいじめ問題に悩まされて生きてきました。今は障害を持ちながら、適度に社会と交流しながら生活していければ良いなと思っています。普通の人とは違う価値観をブログ等で発信していけたら幸いです。 趣味は3DCGモデリングと読書、ゲーム、そしてブログです。

コメントを残す

%d人のブロガーが「いいね」をつけました。