using System;
using System.IO;
using UnityEngine;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace MeshUtility
{
///
/// relative path from Unity project root.
/// For AssetDatabase.
///
public struct UnityPath
{
#region UnityPath
public string Value
{
get;
private set;
}
public override string ToString()
{
return string.Format("unity://{0}", Value);
}
public bool IsNull
{
get { return Value == null; }
}
public bool IsUnderAssetsFolder
{
get
{
if (IsNull)
{
return false;
}
return Value == "Assets" || Value.StartsWith("Assets/");
}
}
public bool IsStreamingAsset
{
get
{
if (IsNull)
{
return false;
}
return FullPath.StartsWith(Application.streamingAssetsPath + "/");
}
}
public string FileName
{
get { return Path.GetFileName(Value); }
}
public string FileNameWithoutExtension
{
get { return Path.GetFileNameWithoutExtension(Value); }
}
public string Extension
{
get { return Path.GetExtension(Value); }
}
public UnityPath Parent
{
get
{
if (IsNull)
{
return default(UnityPath);
}
return new UnityPath(Path.GetDirectoryName(Value));
}
}
public bool HasParent
{
get
{
return !string.IsNullOrEmpty(Value);
}
}
static readonly char[] EscapeChars = new char[]
{
'\\',
'/',
':',
'*',
'?',
'"',
'<',
'>',
'|',
};
static string EscapeFilePath(string path)
{
foreach (var x in EscapeChars)
{
path = path.Replace(x, '+');
}
return path;
}
public UnityPath Child(string name)
{
if (IsNull)
{
throw new NotImplementedException();
}
else if (Value == "")
{
return new UnityPath(name);
}
else
{
return new UnityPath(Value + "/" + name);
}
}
public override int GetHashCode()
{
if (IsNull)
{
return 0;
}
return Value.GetHashCode();
}
public override bool Equals(object obj)
{
if(obj is UnityPath)
{
var rhs = (UnityPath)obj;
if(Value==null && rhs.Value == null)
{
return true;
}
else if (Value == null)
{
return false;
}
else if (rhs.Value == null)
{
return false;
}
else
{
return Value == rhs.Value;
}
}
else
{
return false;
}
}
///
/// Remove extension and add suffix
///
///
///
///
public UnityPath GetAssetFolder(string suffix)
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
return new UnityPath(
string.Format("{0}/{1}{2}",
Parent.Value,
FileNameWithoutExtension,
suffix
));
}
UnityPath(string value) : this()
{
Value = value.Replace("\\", "/");
}
///
///
///
/// Relative from unity current path. GetParent(Application.dataPath)
///
public static UnityPath FromUnityPath(string unityPath)
{
if (String.IsNullOrEmpty(unityPath))
{
return new UnityPath
{
Value=""
};
}
return FromFullpath(Path.GetFullPath(unityPath));
}
#endregion
#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;
}
}
static string AssetFullPath
{
get
{
return BaseFullPath + "/Assets";
}
}
public string FullPath
{
get
{
if (IsNull)
{
throw new NotImplementedException();
}
return Path.Combine(BaseFullPath, Value).Replace("\\", "/");
}
}
public bool IsFileExists
{
get { return File.Exists(FullPath); }
}
public bool IsDirectoryExists
{
get { return Directory.Exists(FullPath); }
}
///
///
///
/// C:/path/to/file
///
public static UnityPath FromFullpath(string fullPath)
{
if(fullPath == null)
{
fullPath = "";
}
fullPath = fullPath.Replace("\\", "/");
if (fullPath == BaseFullPath) {
return new UnityPath
{
Value=""
};
}
else if(fullPath.StartsWith(BaseFullPath + "/"))
{
return new UnityPath(fullPath.Substring(BaseFullPath.Length + 1));
}
else
{
return default(UnityPath);
}
}
public static bool IsUnderAssetFolder(string fullPath)
{
return fullPath.Replace("\\", "/").StartsWith(AssetFullPath);
}
#endregion
[Obsolete("Use TraverseDir()")]
public IEnumerable TravserseDir()
{
return TraverseDir();
}
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 UnityPath.FromFullpath(x);
}
}
}
public IEnumerable ChildFiles
{
get
{
foreach (var x in Directory.GetFiles(FullPath))
{
yield return UnityPath.FromFullpath(x);
}
}
}
#if UNITY_EDITOR
public T GetImporter() where T : AssetImporter
{
return AssetImporter.GetAtPath(Value) as T;
}
public static UnityPath FromAsset(UnityEngine.Object asset)
{
return new UnityPath(AssetDatabase.GetAssetPath(asset));
}
public void ImportAsset()
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
AssetDatabase.ImportAsset(Value);
}
public void EnsureFolder()
{
if (IsNull)
{
throw new NotImplementedException();
}
if (HasParent)
{
Parent.EnsureFolder();
}
if (!IsDirectoryExists)
{
var parent = Parent;
// ensure parent
parent.ImportAsset();
// create
AssetDatabase.CreateFolder(
parent.Value,
Path.GetFileName(Value)
);
ImportAsset();
}
}
public UnityEngine.Object[] GetSubAssets()
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
return AssetDatabase.LoadAllAssetsAtPath(Value);
}
public void CreateAsset(UnityEngine.Object o)
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
AssetDatabase.CreateAsset(o, Value);
}
public void AddObjectToAsset(UnityEngine.Object o)
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
AssetDatabase.AddObjectToAsset(o, Value);
}
public T LoadAsset() where T : UnityEngine.Object
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
return AssetDatabase.LoadAssetAtPath(Value);
}
public UnityPath GenerateUniqueAssetPath()
{
if (!IsUnderAssetsFolder)
{
throw new NotImplementedException();
}
return new UnityPath(AssetDatabase.GenerateUniqueAssetPath(Value));
}
#endif
}
}