namespace Pathfinding {
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
/// Internal utility class for looking up editor resources
public static class EditorResourceHelper {
///
/// Path to the editor assets folder for the A* Pathfinding Project. If this path turns out to be incorrect, the script will try to find the correct path
/// See: LoadStyles
///
public static string editorAssets;
static EditorResourceHelper () {
// Look up editor assets directory when first accessed
LocateEditorAssets();
}
static Material surfaceMat, lineMat;
static Texture2D handlesAALineTex;
public static Material GizmoSurfaceMaterial {
get {
if (!surfaceMat) surfaceMat = UnityEditor.AssetDatabase.LoadAssetAtPath(EditorResourceHelper.editorAssets + "/Materials/Navmesh.mat", typeof(Material)) as Material;
return surfaceMat;
}
}
public static Material GizmoLineMaterial {
get {
if (!lineMat) lineMat = UnityEditor.AssetDatabase.LoadAssetAtPath(EditorResourceHelper.editorAssets + "/Materials/NavmeshOutline.mat", typeof(Material)) as Material;
return lineMat;
}
}
public static Texture2D HandlesAALineTexture {
get {
if (!handlesAALineTex) handlesAALineTex = Resources.Load("handles_aaline");
return handlesAALineTex;
}
}
/// Locates the editor assets folder in case the user has moved it
public static bool LocateEditorAssets () {
#if UNITY_2019_3_OR_NEWER
var package = UnityEditor.PackageManager.PackageInfo.FindForAssembly(typeof(EditorResourceHelper).Assembly);
if (package != null) {
editorAssets = package.assetPath + "/Editor/EditorAssets";
if (System.IO.File.Exists(package.resolvedPath + "/Editor/EditorAssets/AstarEditorSkinLight.guiskin")) {
return true;
} else {
Debug.LogError("Could not find editor assets folder in package at " + editorAssets + ". Is the package corrupt?");
return false;
}
}
#endif
string projectPath = Application.dataPath;
if (projectPath.EndsWith("/Assets")) {
projectPath = projectPath.Remove(projectPath.Length-("Assets".Length));
}
editorAssets = "Assets/AstarPathfindingProject/Editor/EditorAssets";
if (!System.IO.File.Exists(projectPath + editorAssets + "/AstarEditorSkinLight.guiskin") && !System.IO.File.Exists(projectPath + editorAssets + "/AstarEditorSkin.guiskin")) {
//Initiate search
var sdir = new System.IO.DirectoryInfo(Application.dataPath);
var dirQueue = new Queue();
dirQueue.Enqueue(sdir);
bool found = false;
while (dirQueue.Count > 0) {
System.IO.DirectoryInfo dir = dirQueue.Dequeue();
if (System.IO.File.Exists(dir.FullName + "/AstarEditorSkinLight.guiskin") || System.IO.File.Exists(dir.FullName + "/AstarEditorSkin.guiskin")) {
// Handle windows file paths
string path = dir.FullName.Replace('\\', '/');
found = true;
// Remove data path from string to make it relative
path = path.Replace(projectPath, "");
if (path.StartsWith("/")) {
path = path.Remove(0, 1);
}
editorAssets = path;
return true;
}
var dirs = dir.GetDirectories();
for (int i = 0; i < dirs.Length; i++) {
dirQueue.Enqueue(dirs[i]);
}
}
if (!found) {
Debug.LogWarning("Could not locate editor assets folder. Make sure you have imported the package correctly.\nA* Pathfinding Project");
return false;
}
}
return true;
}
}
#endif
}