この記事でのバージョン
Unity 5.4.0f3
はじめに
以前、アセットストアでAutoLocalizationというローカライズ用のアセットをリリースしたのですが、
その時にタイトルの通り、パスの\が原因でバグを発生させてしまいました。
(バグは修正してアップデート済み)
原因
そもそもUnityで何かしらパスを取得しようする場合、MacでもWindowsでも/で区切られます。
しかし、
System.IO.Directory.GetFilesなどのUnityの管理外のメソッドでは\を返してくる事もあるそうです。
たまに\を返してくる、Unityが面倒をみていないメソッドがある。
Unity on WIndowsで/を使ってるのに\パスが紛れ込む原因がわかった話
AutoLocalizationの場合、AutoLocalizationという名前のディレクトリを
System.IO.Directory.GetDirectoriesで探し、
見つけたパスをAssetsからのパスになるように変換した時に問題が起こりました。
//AutoLocalizationという名前のディレクトリを探す string targetDirectoryName = "AutoLocalization"; string[] pathArray = System.IO.Directory.GetDirectories (Application.dataPath, targetDirectoryName, System.IO.SearchOption.AllDirectories); //Assetsからのパスに変換し返す return pathArray[0].Substring(pathArray[0].IndexOf("Assets/")) + "/Script/AutoGeneration/"; //ここでエラー!
Windowsの場合、Assetsの後ろが/ではなく\になるため、
IndexOf("Assets/")の所でエラーが出ていたというわけです。
解決方法
解決方法は単純で、\を/に変換するだけです。
AutoLocalizationの例をあげると以下のような感じです。。
//AutoLocalizationという名前のディレクトリを探す string targetDirectoryName = "AutoLocalization"; string[] pathArray = System.IO.Directory.GetDirectories (Application.dataPath, targetDirectoryName, System.IO.SearchOption.AllDirectories); /*ここを追加*/ pathArray[0] = pathArray[0].Replace("\\", "/");//WindowsだとAssetの後が\になるので置換 //Assetsからのパスに変換し返す return pathArray[0].Substring(pathArray[0].IndexOf("Assets/")) + "/Script/AutoGeneration/";
------------追記------------
ここら辺のパス周りをいい感じに扱えるクラスを作りました!
------------追記おわり------------