using System; using System.IO; using UnityEngine; using System.Collections.Generic; using UnityEditor; namespace UniGLTF.MeshUtility { /// /// Application.dataPath を root とするファイルパスを扱う。 /// (Project/Assets) /// public struct AssetsPath { public string RelativePath { get; private set; } public override string ToString() { return $"assets://{RelativePath}"; } public string FileName { get { return Path.GetFileName(RelativePath); } } public string FileNameWithoutExtension { get { return Path.GetFileNameWithoutExtension(RelativePath); } } public string Extension { get { return Path.GetExtension(RelativePath); } } public AssetsPath Parent { get { return new AssetsPath(Path.GetDirectoryName(RelativePath)); } } static readonly char[] EscapeChars = new char[] { '\\', '/', ':', '*', '?', '"', '<', '>', '|', }; static string EscapeFilePath(string path) { foreach (var x in EscapeChars) { path = path.Replace(x, '+'); } return path; } public AssetsPath Child(string name) { if (RelativePath == null) { throw new NotImplementedException(); } else if (RelativePath == "") { return new AssetsPath(name); } else { return new AssetsPath(RelativePath + "/" + name); } } public override int GetHashCode() { if (RelativePath == null) { return 0; } return RelativePath.GetHashCode(); } public override bool Equals(object obj) { if (obj is AssetsPath) { var rhs = (AssetsPath)obj; if (RelativePath == null && rhs.RelativePath == null) { return true; } else if (RelativePath == null) { return false; } else if (rhs.RelativePath == null) { return false; } else { return RelativePath == rhs.RelativePath; } } else { return false; } } AssetsPath(string value) : this() { RelativePath = value.Replace("\\", "/"); } #region FullPath static string s_basePath; static string BaseFullPath { get { if (string.IsNullOrEmpty(s_basePath)) { s_basePath = Path.GetFullPath(Application.dataPath).Replace("\\", "/"); } return s_basePath; } } public string FullPath { get { if (RelativePath == null) { throw new NotImplementedException(); } return Path.Combine(BaseFullPath, RelativePath).Replace("\\", "/"); } } public bool IsFileExists { get { return File.Exists(FullPath); } } public bool IsDirectoryExists { get { return Directory.Exists(FullPath); } } /// /// /// /// C:/path/to/file /// public static AssetsPath FromFullpath(string fullPath) { if (fullPath == null) { fullPath = ""; } fullPath = fullPath.Replace("\\", "/"); if (fullPath == BaseFullPath) { return new AssetsPath { RelativePath = "" }; } else if (fullPath.StartsWith(BaseFullPath + "/")) { return new AssetsPath(fullPath.Substring(BaseFullPath.Length + 1)); } else { return default(AssetsPath); } } #endregion public IEnumerable TraverseDir() { if (IsDirectoryExists) { yield return this; foreach (var child in ChildDirs) { foreach (var x in child.TraverseDir()) { yield return x; } } } } public IEnumerable ChildDirs { get { foreach (var x in Directory.GetDirectories(FullPath)) { yield return AssetsPath.FromFullpath(x); } } } public IEnumerable ChildFiles { get { foreach (var x in Directory.GetFiles(FullPath)) { yield return AssetsPath.FromFullpath(x); } } } #if UNITY_EDITOR string UnityPath => $"Assets/{RelativePath}"; public T GetImporter() where T : AssetImporter { return AssetImporter.GetAtPath(UnityPath) as T; } public static AssetsPath FromAsset(UnityEngine.Object asset) { // skip Assets/ return new AssetsPath(AssetDatabase.GetAssetPath(asset).Substring(7)); } public void ImportAsset() { AssetDatabase.ImportAsset(UnityPath); } public void EnsureFolder() { if (RelativePath == null) { throw new NotImplementedException(); } if (!string.IsNullOrEmpty(Parent.RelativePath)) { Parent.EnsureFolder(); } if (!IsDirectoryExists) { var parent = Parent; // ensure parent parent.ImportAsset(); // create AssetDatabase.CreateFolder( parent.UnityPath, Path.GetFileName(RelativePath) ); ImportAsset(); } } public UnityEngine.Object[] GetSubAssets() { return AssetDatabase.LoadAllAssetsAtPath(UnityPath); } public void CreateAsset(UnityEngine.Object o) { AssetDatabase.CreateAsset(o, UnityPath); } public void AddObjectToAsset(UnityEngine.Object o) { AssetDatabase.AddObjectToAsset(o, UnityPath); } public T LoadAsset() where T : UnityEngine.Object { return AssetDatabase.LoadAssetAtPath(UnityPath); } public AssetsPath GenerateUniqueAssetPath() { return new AssetsPath(AssetDatabase.GenerateUniqueAssetPath(UnityPath)); } #endif } }