概要
自作パッケージをUPMで管理しており、パッケージ内でTextureなどのアセットをパス指定で取得していた.しかし、パッケージが開発時はAssetsフォルダ内、配布時はPackagesフォルダ内に配置されるため、アセットの読み込みに失敗していた.
そのため「パッケージディレクトリ」へのパスを管理するクラスを作成し、アセットの参照を相対パスに基づいて行うようにした.
実装コード
パス管理用のクラス
PackageDirectoryPath.cs
using System.IO;
using UnityEngine;
namespace nitou {
[System.Serializable]
public sealed class PackageDirectoryPath {
public enum Mode {
// 配布後
Upm,
// 開発プロジェクト内
Normal,
//
NotExist,
}
// 相対パス
private readonly string _upmRelativePath;
private readonly string _normalRelativePath;
private Mode _mode;
/// <summary>
/// Package配布後のパッケージパス
/// </summary>
public string UpmPath => $"Packages/{_upmRelativePath}";
/// <summary>
/// 開発プロジェクトでのアセットパス
/// </summary>
public string NormalPath => $"Assets/{_normalRelativePath}";
/// ----------------------------------------------------------------------------
// Pubic Method
/// <summary>
/// コンストラクタ
/// </summary>
public PackageDirectoryPath(string relativePath = "com.nitou.mylib") {
_upmRelativePath = relativePath;
_normalRelativePath = relativePath;
// 判定する
_mode = CheckDirectoryLocation();
}
/// <summary>
/// コンストラクタ (※開発時にAssets直下にない場合)
/// </summary>
public PackageDirectoryPath(
string upmRelativePath = "com.nitou.mylib",
string normalRelativePath = "Plugins/com.nitou.mylib") {
_upmRelativePath = upmRelativePath;
_normalRelativePath = normalRelativePath;
// 判定する
_mode = CheckDirectoryLocation();
}
/// <summary>
/// Projectディレクトリを起点としたパス
/// </summary>
public string ToProjectPath() {
return _mode switch {
Mode.Upm => UpmPath,
Mode.Normal => NormalPath,
_ => ""
};
}
/// <summary>
/// 絶対パス
/// </summary>
public string ToAbsolutePath() => Path.GetFullPath(ToProjectPath());
/// ----------------------------------------------------------------------------
// Private Method
/// <summary>
/// ディレクトリの位置を判定する
/// </summary>
private Mode CheckDirectoryLocation() {
if (Directory.Exists(UpmPath)) return Mode.Upm;
if (Directory.Exists(NormalPath)) return Mode.Normal;
Debug.LogError($"Directory not found in both UPM and normal paths: \n" +
$" [{UpmPath}] and \n" +
$" [{NormalPath}]");
return Mode.NotExist;
}
}
}