音声データ順番に再生していくアプリを作っているのですが
うまくいかない部分があるので教えて下さい。
やっている事)
1、AudioAutoPlay〇〇というスクリプトを使って
Resourcesフォルダから音声ファイルを呼び出します。
2、次に呼び出した音声ファイルのlengthを取得してから
AutoVoiceスクリプトのInvokeで音声を再生します。
3、取得したlengthと間の時間を考慮してInvokeの引数に設定しています。
実際にこれでテストをするとなぜか音声が重なってしまいます。
テストしたところ、メンバ変数のaudioClipLengthをAudioAutoPlay〇〇で
取得するのですがその取得したaudioClipLengthがAutoVoiceスクリプトのInvoke
で反映されていません(audioClipLengthが0になっている)
推測ですがResourcesフォルダで呼び出したリソースからaudioClipLengthを
呼び出しているのでResourcesを呼び出すタイムラグで取得できないものと
判断しています。
質問)
対策としてIEnumeratorを使ってResourcesの取得が完了したらaudioClipLengthを
取得してAutoVoiceスクリプトに反映させる手順を作りたいのですが
返り値が使えないInvokeにIEnumeratorがらみのAudioAutoPlay〇〇を設定する方法が
考え付きません。分かる方、教えて下さい。
環境)
PC: mac
Unity2018.3.14f1
言語:C#
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; public class AudioAutoScript : MonoBehaviour { #pragma warning disable 649 [SerializeField]Entity_titlelist etitlelist; [SerializeField]Entity_voicelist evoicelist; private int phraseNum; //再生するデータ数 private int startPos; //再生するデータの開始番号 private float audiocliplength; //再生される音声の時間 private float audioAllSeconds; //実際のインターバル時間(グロス) private string dataNameTitle; private string dataName0; private string dataName1; private string dataName2; private string dataName3; private string dataName4; private int indexItemNo; private AudioSource audioSource; private AudioClip audioClip; float firstIntervalSeconds = 2.0f; float intervalSeconds = 1.0f; // Start is called before the first frame update void Start() { //AudioSourceを取得する audioSource = gameObject.GetComponent<AudioSource>(); int AutoFlag = PlayerPrefs.GetInt("autoflag"); if(AutoFlag == 0){ indexItemNo = int.Parse(PlayerPrefs.GetString("indexitemno")); AutoVoice(); // StartCoroutine("AutoVoice"); }else{ indexItemNo = PlayerPrefs.GetInt("autocount",1); AutoVoice(); // StartCoroutine("AutoVoice"); } } // Update is called once per frame void Update() { } private void AutoVoice(){ // private IEnumrator AutoVoice(){ var voiceElement = evoicelist.sheets[0].list.Where(data => data.phrase_id == indexItemNo).FirstOrDefault(); startPos = voiceElement.converse_id - 1; phraseNum = evoicelist.sheets[0].list.Count(data => data.phrase_id == indexItemNo); dataNameTitle = etitlelist.sheets[0].list[indexItemNo - 1].conversation_file; dataName0 = evoicelist.sheets[0].list[startPos].conversation_file; dataName1 = evoicelist.sheets[0].list[startPos + 1].conversation_file; dataName2 = evoicelist.sheets[0].list[startPos + 2].conversation_file; dataName3 = evoicelist.sheets[0].list[startPos + 3].conversation_file; dataName4 = evoicelist.sheets[0].list[startPos + 4].conversation_file; switch(phraseNum){ case 2: Invoke("AudioAutoPlayTitle", 1.0f); audioAllSeconds = audiocliplength + firstIntervalSeconds + 2.0f; Invoke("AudioAutoPlay0",audioAllSeconds); audioAllSeconds += (audiocliplength + intervalSeconds); Invoke("AudioAutoPlay1",audioAllSeconds); audioAllSeconds += (audiocliplength + intervalSeconds); PlayerPrefs.SetFloat("audidoallseconds", audioAllSeconds); PlayerPrefs.Save(); audioAllSeconds = 0.0f; break; case 3: Invoke("AudioAutoPlayTitle", 1.0f); audioAllSeconds = audiocliplength + firstIntervalSeconds; Invoke("AudioAutoPlay0",audioAllSeconds); Debug.Log("audioallseconds" + audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; Invoke("AudioAutoPlay1",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; Invoke("AudioAutoPlay2",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; audioAllSeconds = 0.0f; break; case 4: Invoke("AudioAutoPlayTitle", 1.0f); audioAllSeconds = audiocliplength + firstIntervalSeconds + 2.0f; Debug.Log("audioallseconds0:" + audioAllSeconds); Invoke("AudioAutoPlay0",audioAllSeconds); audioAllSeconds += (audiocliplength + intervalSeconds); Debug.Log("audioallseconds1:" + audioAllSeconds); Invoke("AudioAutoPlay1",audioAllSeconds); audioAllSeconds += (audiocliplength + intervalSeconds); Debug.Log("audioallseconds2:" + audioAllSeconds); Invoke("AudioAutoPlay2",audioAllSeconds); audioAllSeconds += (audiocliplength + intervalSeconds); Debug.Log("audioallseconds3:" + audioAllSeconds); Invoke("AudioAutoPlay3",audioAllSeconds); audioAllSeconds += (audiocliplength + intervalSeconds); Debug.Log("audioallseconds4:" + audioAllSeconds); // PlayerPrefs.SetFloat("audidoallseconds", audioAllSeconds); // PlayerPrefs.Save(); audioAllSeconds = 0.0f; break; case 5: Invoke("AudioAutoPlayTitle", 1.0f); // audioAllSeconds = audiocliplength + firstIntervalSeconds + 2.0f; audioAllSeconds = audiocliplength + firstIntervalSeconds; Invoke("AudioAutoPlay0",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; Invoke("AudioAutoPlay1",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; Invoke("AudioAutoPlay2",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; Invoke("AudioAutoPlay3",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; Invoke("AudioAutoPlay4",audioAllSeconds); audioAllSeconds = audioAllSeconds + audiocliplength + intervalSeconds; // PlayerPrefs.SetFloat("audidoallseconds", audioAllSeconds); // PlayerPrefs.Save(); audioAllSeconds = 0.0f; break; default: // AudioAutoPlayTitle(); Invoke("AudioAutoPlayTitle", 1.0f); audioAllSeconds = audiocliplength + firstIntervalSeconds + 2.0f; Invoke("AudioAutoPlay0",audioAllSeconds); audioAllSeconds += audiocliplength + intervalSeconds; Invoke("AudioAutoPlay1",audioAllSeconds); audioAllSeconds += audiocliplength + intervalSeconds; PlayerPrefs.SetFloat("audidoallseconds", audioAllSeconds); PlayerPrefs.Save(); audioAllSeconds = 0.0f; break; } } void AudioAutoPlayTitle(){ audioClip = ResourcesAudio(dataNameTitle); audioSource.PlayOneShot(audioClip); audiocliplength = audioClip.length; } void AudioAutoPlay0(){ audiocliplength = ResourcesAudio(dataName0).length; Debug.Log("audioclip0:" + audiocliplength); audioSource.PlayOneShot(audioClip); } void AudioAutoPlay1(){ audiocliplength = ResourcesAudio(dataName1).length; Debug.Log("audioclip1:" + audiocliplength); audioSource.PlayOneShot(audioClip); } void AudioAutoPlay2(){ audiocliplength = ResourcesAudio(dataName2).length; Debug.Log("audioclip2:" + audiocliplength); audioSource.PlayOneShot(audioClip); } void AudioAutoPlay3(){ audiocliplength = ResourcesAudio(dataName3).length; Debug.Log("audioclip3:" + audiocliplength); audioSource.PlayOneShot(audioClip); } void AudioAutoPlay4(){ audiocliplength = ResourcesAudio(dataName4).length; audioSource.PlayOneShot(audioClip); } AudioClip ResourcesAudio(string dataName) { audioClip = Resources.Load("Voices/" + dataName)as AudioClip; return audioClip; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/21 08:17