質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1084閲覧

Unity)Invokeとコルーチン

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/07/21 04:37

音声データ順番に再生していくアプリを作っているのですが
うまくいかない部分があるので教えて下さい。

やっている事)
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; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C#

1void Start () { 2 StartCoroutine("AutoVoice"); 3} 4private IEnumrator AutoVoice() { 5 yield return AudlioPlay(dataNameTitle); 6 yield return AudlioPlay(dataName0); 7 yield return AudlioPlay(dataName1); 8 // 以下省略 9} 10private IEnumrator AudlioPlay(string fileName) { 11 audioClip = ResourcesAudio(fileName); 12 audioSource.PlayOneShot(audioClip); 13 14 // (※)以下がもしかしたら必要かも(ロード・再生開始までに時間かかるかも) 15 yield return null; 16 17 // audioClip.lengthがちゃんと取れるなら以下でOK 18 yield return new WaitForSeconds(audioClip.length); 19 20 // audioClip.lengthがどうしても0になるようなら以下にしてみるとか 21 while (audioSource.isPlaying) { 22 yield return null; 23 } 24}

コルーチンを使うなら、そもそもInvokeを使う必要がありません。
yield return コルーチン;とすると、そのコルーチンが終了するまで待機します)

ただ何故audioClipLengthが0になるのか分かりません。恐らくロード時間が発生しているのだと思いますが、Debug.Log仕込んだり※部分の待ち時間を変えたりして検証してみてください。
(ちなみにyield return null;は「1フレーム」の時間に相当します)

投稿2019/07/21 06:17

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

navesanta

2019/07/21 08:17

うまくいきました。 audioClip.lengthも0になりませんでした。 ありがとうございます。これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問