[unity]指定されたファイルがどのパスにあるか調べる

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 が使えないビルドターゲットも(少ないとは思いますが)存在します。

返信を残す

メールアドレスが公開されることはありません。

CAPTCHA