(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

アセットをリリースしたらパスの\が原因でバグった件【Unity】【Windows】【トラブルシューティング】


このエントリーをはてなブックマークに追加

この記事でのバージョン
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/";