1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】自作パッケージでフォルダ内のアセットを参照する

Last updated at Posted at 2024-09-17

概要

自作パッケージを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;
        }
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?