(:3[kanのメモ帳]

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

(:3[kanのメモ帳]



UnityでWindowsの区切り文字(\)が紛れ込まないように、色々なパスを扱う【Unity】【C#】


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


この記事でのバージョン
Unity 2018.4.13f1


はじめに

Unityはパスの区切り文字に/を使いますが、これはMacでもWindowsでも共通です。

例えばAssetDatabase.GetAssetPathを使って、アセットのパスを取得してみると

以下のような感じでMacでもWindowsでも共通のパスが取得できます。

//Resources直下にあるPrefabのパスを取得
var prefab = Resources.Load<GameObject>("Prefab");
Debug.Log(AssetDatabase.GetAssetPath(prefab));
f:id:kan_kikuchi:20191223112431j:plain


しかし、System.IO.Directory.GetFilesなどのUnityの管理外のメソッドでは\を返してくる事もあります。

実は、これが原因でバグを発生させた事もありました。



これの対処法は取得したパスにある\を/に変換するだけなのですが、

パスを取得する度に変換処理を書くのは面倒ですし、忘れる事もありそうです。


と言う事で今回は、Windowsの区切り文字(\)が紛れ込まないように、色々なパスを扱うためのクラス

を作って見ました!

PathUtility

さっそくですがWindowsの区切り文字(\)が紛れ込まないように、

色々なパスを扱うためのクラス、PathUtilityのコードです。



使い方は簡単、MacとWindowsで区切り文字が変わってしまうメソッドを持った

PathやDirectoryと言ったクラスの代わりにPathUtilityを使うだけ。


例えばパスの結合を行うCombineや、

//パスの結合
Debug.Log(PathUtility.Combine("Assets/Resources", "Prefab.prefab"));
f:id:kan_kikuchi:20191223114348j:plain


パスで指定したディレクトリに含まれる全てのファイルを取得するGetFilesなどがあります。

//Assets以下のファイルを全て取得
foreach (var filePath in PathUtility.GetFiles("Assets")) {
  Debug.Log(filePath);
}
f:id:kan_kikuchi:20191223114603j:plain


また、Windowsで使われる事がある区切り文字を

MacやUnity用の区切り文字に置き換えるReplaceDelimiterもあります。

(他の各メソッドは内部でReplaceDelimiterを使っているので、区切り文字が統一される感じ)

//Windowsの区切り文字 \ が紛れてるパスをMacやUnity用の区切り文字に置き換える
Debug.Log(PathUtility.ReplaceDelimiter("Assets\\Resources/Prefab.prefab"));
f:id:kan_kikuchi:20191223114758j:plain


ついでに前回記事にした



呼び出し元のファイルのパスを取得するメソッドも追加してみました。

//呼び出し元のパスを取得
Debug.Log(PathUtility.GetSelfPath());

//呼び出し元のパス(Assetsから)を取得
Debug.Log(PathUtility.GetSelfPathFromAssets());
f:id:kan_kikuchi:20191223114942j:plain