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

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

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

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

Unity

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

Q&A

解決済

1回答

5191閲覧

Unityでファイル名に#(シャープ)記号を含む音声ファイルを外部から読み込みたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2015/08/27 09:28

編集2015/08/27 09:35

Unityで、外部から音声ファイルを読み込んでアプリ上で鳴らす機能を実装しようとしています。
調べたところResources.Loadを使う方法とWWWクラスを使う方法を見つけました。
読み込む音声ファイルの置く場所は自由に設定できるようにしたかったので、Resources.Loadは避け、コルーチンを用いてWWWクラスで読み込む形にしました。以下はそのメソッドを示したコードです。

lang

1IEnumerator loadSound ( AudioSource audioSource, string filePath) { 2 Debug.Log ( filePath ); // ログ1 3 // ファイル読み込み 4 WWW www = new WWW (@"file://" + @filePath); 5 yield return www; 6 if (string.IsNullOrEmpty(www.error) == false) { 7 Debug.Log (www.error); // ログ2 8 } 9 audioSource.clip = www.audioClip; 10}

デスクトップに音声ファイルa#1.oggを置き、audioSourceを用意してStartメソッドでStartCoroutine( loadSound(audioSource, @"/Users/XXX/Desktop/a#1.ogg") )のように絶対パスで指定し、audioSource.play()で音を鳴らそうとしたのですが、鳴りませんでした。コンソールで出力されたログを見てみると、
ログ1:/Users/XXX/Desktop/a#1.ogg
ログ2:Couldn't open file /Users/XXX/Desktop/a
となっていました。
ファイル名を#(シャープ)記号を含まないものに換えてみたところ、今度は正常に読み込め、再生もできました。

ログから察するに、ファイルを読み込めなかったのは、WWWクラスが引数としてアドレスを渡されたとき、#以降の文字列を認識しないようになっていることが原因だと思われるのですが、実際のところWWWクラスはどのような仕組みでファイルを読み込んでいるのでしょうか?また、どうすればUnityで#記号を含むファイル名を外部から読み込めるのでしょうか?WWWクラスを用いない方法でもいいので、ご教授お願いします。

追記:#記号は音楽の記号として使われているので、音声ファイルの名前にも#を含んだものがときどきあります。なるべくリネームなどを手動で行わずに、プログラム上でそういったファイルに対応したいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

予想での回答となってしまって申し訳ありませんが、何もないよりはと思って書いてみます。

恐らくWWWクラスの引数として渡す文字列はURLとして扱われるので、#を含んでしまうと以降の文字列はアンカーしていとして扱われてしまうのだと思います。
上手く行くかはわかりませんが、#をパーセントエンコーディング(URLエンコード)して、%23に変換してみてはいかがでしょうか。
質問文に記載されているパスなら以下のようになります。

/Users/XXX/Desktop/a%231.ogg

上記で上手く行かないとなると、#入りのファイルを指定するのは難しいかもしれません。

投稿2015/08/27 13:23

編集2015/08/27 13:24
hy3

総合スコア594

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

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

退会済みユーザー

退会済みユーザー

2015/08/28 01:55

回答ありがとうございます。loadSoundコルーチンのログ1の次の行に if (filePath.Contains("#")) { filePath = filePath.Replace("#", "%23"); } を入れて実行してみると、再生できました。また#を含むファイル名にも自動で対応できるようになったので、当初の目的を達成することができました。 それにしても、パーセントコーディングというものがあるのですね。WWWクラスは本来URLを指定してダウンロード?するクラスのようなので、そのURLにもエスケープ文字的なものが用意されていることに気づいていれば・・・ http://www.seil.jp/support/management/url-encode.html 手詰まりだったので楽な方法を知ることができ、助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問