Unity ParticleSystemで打ち上げ花火(Unity5.5対応)で作った花火に音をつけたかったのですが、SubEmitterで機能するのはParticleSystemだけなのでParticleSystemだけでは完結できませんでした。
・まずベース(ひゅるるるの部分)についていたLoopを外します(つまり打ち上げ花火一つ毎にInstantiateする必要があります)。
・鳴らしたいAudioSourceのついたGameObjectを追加します。
・下記のソースコードを追加し、上記GameObjectをアタッチます。
[修正]dozeou_monさんにいただいたアドバイスを元にコルーチン化しました
FireworksSeed.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FireworksSeed : MonoBehaviour {
[SerializeField]
private GameObject explodeAudioObj;
private ParticleSystem seedPs;
// Use this for initialization
void Start () {
seedPs = GetComponent<ParticleSystem>();
StartCoroutine(ProgressCo());
}
// Update is called once per frame
void Update () {
}
private int getSubEmitterParticleNum()
{
int ptNum = 0;
ParticleSystem[] psArr = GetComponentsInChildren<ParticleSystem>();
foreach (ParticleSystem ps in psArr)
{
ptNum += ps.particleCount;
}
return ptNum;
}
IEnumerator ProgressCo()
{
// ひゅるるる待ち
while (seedPs.particleCount == 0)
{
yield return null;
}
// ひゅるるるの間は音の位置を移動
while (seedPs.particleCount > 0)
{
ParticleSystem.Particle[] pps = new ParticleSystem.Particle[seedPs.particleCount];
explodeAudioObj.transform.localPosition = pps[0].position;
yield return null;
}
// 爆発待ち
while (getSubEmitterParticleNum() == 0)
{
yield return null;
}
// 爆発音
explodeAudioObj.GetComponent<AudioSource>().pitch *= Random.Range(0.8f, 1.2f);
explodeAudioObj.GetComponent<AudioSource>().Play();
// 消滅待ち
while (getSubEmitterParticleNum() > 0)
{
yield return null;
}
// 消滅
Destroy(gameObject);
}
}