この記事でのバージョン
Unity 2018.4.13f1
はじめに
Unityはパスの区切り文字に/を使いますが、これはMacでもWindowsでも共通です。
例えばAssetDatabase.GetAssetPathを使って、アセットのパスを取得してみると
以下のような感じでMacでもWindowsでも共通のパスが取得できます。
//Resources直下にあるPrefabのパスを取得 var prefab = Resources.Load<GameObject>("Prefab"); Debug.Log(AssetDatabase.GetAssetPath(prefab));
しかし、System.IO.Directory.GetFilesなどのUnityの管理外のメソッドでは\を返してくる事もあります。
実は、これが原因でバグを発生させた事もありました。
これの対処法は取得したパスにある\を/に変換するだけなのですが、
パスを取得する度に変換処理を書くのは面倒ですし、忘れる事もありそうです。
と言う事で今回は、Windowsの区切り文字(\)が紛れ込まないように、色々なパスを扱うためのクラス
を作って見ました!
PathUtility
さっそくですがWindowsの区切り文字(\)が紛れ込まないように、
色々なパスを扱うためのクラス、PathUtilityのコードです。
使い方は簡単、MacとWindowsで区切り文字が変わってしまうメソッドを持った
PathやDirectoryと言ったクラスの代わりにPathUtilityを使うだけ。
例えばパスの結合を行うCombineや、
//パスの結合 Debug.Log(PathUtility.Combine("Assets/Resources", "Prefab.prefab"));
パスで指定したディレクトリに含まれる全てのファイルを取得するGetFilesなどがあります。
//Assets以下のファイルを全て取得 foreach (var filePath in PathUtility.GetFiles("Assets")) { Debug.Log(filePath); }
また、Windowsで使われる事がある区切り文字を
MacやUnity用の区切り文字に置き換えるReplaceDelimiterもあります。
(他の各メソッドは内部でReplaceDelimiterを使っているので、区切り文字が統一される感じ)
//Windowsの区切り文字 \ が紛れてるパスをMacやUnity用の区切り文字に置き換える Debug.Log(PathUtility.ReplaceDelimiter("Assets\\Resources/Prefab.prefab"));
ついでに前回記事にした
呼び出し元のファイルのパスを取得するメソッドも追加してみました。
//呼び出し元のパスを取得 Debug.Log(PathUtility.GetSelfPath()); //呼び出し元のパス(Assetsから)を取得 Debug.Log(PathUtility.GetSelfPathFromAssets());