An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.6 KiB

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace UnityTest
{
public static class EditorReferencesUtil
{
public static List<Object> FindScenesWhichContainAsset(string file)
{
string assetPath = GetAssetPathFromFileNameAndExtension (file);
Object cur = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Object));
return AllScenes.Where(a => ADependsOnB(a, cur)).ToList();
}
private static string CleanPathSeparators(string s)
{
const string forwardSlash = "/";
const string backSlash = "\\";
return s.Replace(backSlash, forwardSlash);
}
private static string GetRelativeAssetPathFromFullPath(string fullPath)
{
fullPath = CleanPathSeparators(fullPath);
if (fullPath.Contains(Application.dataPath))
{
return fullPath.Replace(Application.dataPath, "Assets");
}
Debug.LogWarning("Path does not point to a location within Assets: " + fullPath);
return null;
}
private static string GetAssetPathFromFileNameAndExtension(string assetName)
{
string[] assets = AssetDatabase.FindAssets (Path.GetFileNameWithoutExtension (assetName));
string assetPath = null;
foreach (string guid in assets) {
string relativePath = AssetDatabase.GUIDToAssetPath (guid);
if (Path.GetFileName (relativePath) == Path.GetFileName (assetName))
assetPath = relativePath;
}
return assetPath;
}
private static List<FileInfo> DirSearch(DirectoryInfo d, string searchFor)
{
List<FileInfo> founditems = d.GetFiles(searchFor).ToList();
// Add (by recursing) subdirectory items.
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
founditems.AddRange(DirSearch(di, searchFor));
return (founditems);
}
private static List<Object> AllScenes
{
get
{
// get every single one of the files in the Assets folder.
List<FileInfo> files = DirSearch(new DirectoryInfo(Application.dataPath), "*.unity");
// now make them all into Asset references.
List<Object> assetRefs = new List<Object>();
foreach (FileInfo fi in files)
{
if (fi.Name.StartsWith("."))
continue; // Unity ignores dotfiles.
assetRefs.Add(AssetDatabase.LoadMainAssetAtPath(GetRelativeAssetPathFromFullPath(fi.FullName)));
}
return assetRefs;
}
}
private static bool ADependsOnB(Object obj, Object selectedObj)
{
if (selectedObj == null) return false;
//optionally, exclude self.
if (selectedObj == obj) return false;
Object[] dependencies = EditorUtility.CollectDependencies(new Object[1] { obj });
if (dependencies.Length < 2) return false; // if there's only one, it's us.
foreach (Object dep in dependencies)
if (dep == selectedObj)
return true;
return false;
}
}
}