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()」で同じくインスペクターで登録する音を鳴らします。
以上です。
・・・え?とお思いのあなたへ、
これがすべてです。
僕がドアの開閉に音を鳴らしたいなと思ったとき、複数の音源を扱うにはどうしたらいいのかググりまくって、結果英語圏で見つかったものを活用させてもらいました。
では、これでひとまず終わりとさせていただきます。