前提
Unityを使いアプリを作っています。
その際、ネイティブの音声再生を使用することとなりました。
UnityからSwiftをpluginとして読み込んでいます。
UnityからSwift上のメソッドを呼び出すことまでは成功したのですが、音が出ません
該当コード
Test.h
1import Foundation 2import AVFoundation 3 4 5@objc public class Test : NSObject { 6 7 @objc public static func play() { 8 9 var player: AVAudioPlayer? 10 11 if let soundURL = Bundle.main.url(forResource: "sound", withExtension: "wav") { 12 do { 13 player = try AVAudioPlayer(contentsOf: soundURL) 14 player?.play() 15 print("play") 16 } catch { 17 print("error") 18 } 19 } 20 } 21}
問題点
上記コードで"play"がprintされるところまでは確認しています。
Playingで状態を調べたところ、Trueを示したので内部的には再生されているものと思われます。
これは予想としてですが、Viewとこの音声が結びついていないことが原因ではないかと思っています。ですが、Swiftの知識が薄く解決方法が見出せません。
その他の解決策含め、何か知識をいただけると嬉しいです。
Version
Unity: 2021.3.16f1
x-code: 14.2
var player が play メソッドのローカル変数になってるからでは。(static メソッドになってるけど、インスタンスの管理どうするんだろう?)
Swift上のローカル・グローバル変数の扱いについて知見が深くないのですが、player?.playは正常に動作していました。それでは不十分ということですかね?
おそらくインスタンス化していると思うのでStaticは好ましくなさそうです。
申し訳ないのですが、Swiftの仕組み・ライフスケジュールに詳しくないので曖昧な回答になっています。
player がローカル変数なので、その関数を抜ける時に解放されてしまい、再生が停止するため音が鳴りません。Swift のアプリなら UIViewController などのプロパティにすれば画面が表示されている間は player が生存して音が鳴りますが、Unity から利用する場合は Unity 側でインスタンスを管理する必要があるかと…。
https://qiita.com/mao_/items/07466e169d08cbeff221
回答ありがとうございます。Unity側でインスタンスを管理とありましたがその方法がいまいちわかっておらず苦戦しています。こちらでももう少し調べる予定なのですが、もし他に文献などありましたら教えていただけると幸いです。
自分は Unity のことは詳しくないので…。一般的にクロスプラットフォームの開発ツールで特定の環境に依存した処理をしようとすると、結局両方 (この場合は Unity と Swift) に詳しくなる必要があったりします。頑張ってください。
あなたの回答
tips
プレビュー