Editor 用のツールを作っていると度々必要になる機能。
例として、PPSProfile_BundledAssetGroupSchema.asset のパスを取得することにします。
unity で必要なのは Assets/ で始まる相対パスです。
絶対パスの場合、Warning が出ます(確か)
絶対パス
D:\games\SampleTest\Assets\AddressableAssetsData\AssetGroups\Schemas\PPSProfile_BundledAssetGroupSchema.asset
Assets 相対パス
Assets\AddressableAssetsData\AssetGroups\Schemas\PPSProfile_BundledAssetGroupSchema.asset
また、パスの連結文字列は Mac(unity) と Windows で異なります。
Mac(unity) は / ですが、Windows は \ です。
この呪いもついでに回収することにしましょう。
Source Code
using System.IO; using UnityEngine; public static class FileEx { public static string FindPath(string name) { var paths = Directory.GetFiles(Application.dataPath, name, SearchOption.AllDirectories); if (paths != null && paths.Length > 0) { return paths[0].Replace("\\", "/").Replace(Application.dataPath, "Assets"); } return null; } }
解説
Assets/ 下を検索します。Assets/ の絶対パスは Application.dataPath で取得します。
連結文字列は Replace("\", "/") で / に統一します。
絶対パスから Assets 相対パスは Replace(Application.dataPath, "Assets") で変換します。
ファイルが見つからなかった場合は null を返します。
複数見つかった場合、最初の1つを返します。
(複数返すように改造してもいいかもしれません)
ビルド環境では使わない方がいい(多分)
System.IO に属するコマンド(Directory.GetFiles とか)を使った場合、特定のビルドターゲットによっては使えないかもしれないので、あくまで Editor 機能で使うにとどめておいた方がいいかもしれません。
Application.persistentDataPath が使えないビルドターゲットも(少ないとは思いますが)存在します。