実現したいこと
Unityで下記のような動作を実現したい
- 監視しているフォルダにある音声ファイルが更新されたら、audioSource Objectにそのファイルをアタッチする
前提
この機能を実現するためにテストとしてソースコードAを作成し、問題なく動作(Oキーを押すと音声データがスウィッチし、変更後の音声が再生)しました
ソースコードA
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class audioSwitchTest : MonoBehaviour 6{ 7 public AudioSource testAudio; // testAudio AudioSourceへの参照 8 9 private void Update() 10 { 11 AudioSource audioSource = testAudio.GetComponent<AudioSource>(); 12 if (Input.GetKeyDown(KeyCode.O)) 13 { 14 if (testAudio != null && !testAudio.isPlaying) 15 { 16 AudioClip newClip = Resources.Load<AudioClip>("Wav/audio"); 17 audioSource.clip = newClip; 18 audioSource.Play(); 19 } 20 } 21 } 22}
発生している問題・エラーメッセージ
この処理をそのままソースコードB内に持ってきたのですが、こちらでは「音声データを切り替え、再生する」の処理が動きません(※1)。33行目のDebug.Logは正しく表示されますが、それより先は処理されてないようです。36行目もログの表示がそもそも実行されません(※2)
なぜコードAでは動作して、Bでは動作しないかわかりません。最終的にはコードBを動かしたいです。
※1:inspectorビューで切り替わってないことを確認済み
※2:37行目がうまくいってないとしても、「null」とか「元の音声ファイル名」等が表示されるのではないかと予想したので不可解です
備考
・testAudioというObjectはgameObjectにアタッチされています。
・chatGPTに本問題について聞きましたが解決しませんでした
ソースコードB
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO; 5 6public class FileWatcher : MonoBehaviour 7{ 8 private FileSystemWatcher watcher; 9 [SerializeField] private string folderPath; // 監視するフォルダのパス 10 // [SerializeField] private GameObject testAudio; // 音声を再生するAudioSourceがアタッチされたGameObject 11 12 public AudioSource testAudio; 13 14 private void Start() 15 { 16 watcher = new FileSystemWatcher(); 17 folderPath="C:\\Users(絶対パス、中略)\Assets\\Resources\\Wav"; 18 watcher.Path = folderPath; 19 20 // 監視するイベントを設定 21 watcher.NotifyFilter = NotifyFilters.LastWrite; 22 23 // イベントハンドラを設定 24 watcher.Changed += OnFileChanged; 25 26 // 監視を開始 27 watcher.EnableRaisingEvents = true; 28 } 29 30 void OnFileChanged(object sender, FileSystemEventArgs e) 31 { 32 // ファイルが更新された時の処理を記述 33 Debug.Log("File Updated: " + e.FullPath); 34 35 AudioSource audioSource = testAudio.GetComponent<AudioSource>(); 36 37 AudioClip newClip = Resources.Load<AudioClip>("Wav/audio"); 38 Debug.Log(newClip); 39 audioSource.clip = newClip; 40 audioSource.Play(); 41 } 42 43 private void OnApplicationQuit() 44 { 45 // 監視を停止 46 watcher.EnableRaisingEvents = false; 47 watcher.Dispose(); 48 } 49 50}
補足情報(FW/ツールのバージョンなど)
Unity version:2021.3.26f1
OS:Windows11

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/06/17 02:25