using UnityEngine;
using UnityEditor;
using System.Text;
/// Dumps what a third-party pack exposes (components, serialized fields, scripts) so it can be wired up from code.
public static class AFXInspect
{
[MenuItem("AFX/Inspect Fish Alive")]
public static void InspectFishAlive()
{
var sb = new StringBuilder("AFX INSPECT\n");
foreach (var guid in AssetDatabase.FindAssets("", new[] { Root() }))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
if (AssetDatabase.IsValidFolder(path)) continue;
sb.Append("file " + path + "\n");
}
foreach (var guid in AssetDatabase.FindAssets("t:Prefab", new[] { Root() }))
{
var go = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid));
sb.Append("PREFAB " + go.name + "\n");
foreach (var c in go.GetComponentsInChildren(true)) Dump(sb, c, " ");
}
foreach (var guid in AssetDatabase.FindAssets("t:ScriptableObject", new[] { Root() }))
{
var so = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid));
if (so != null) { sb.Append("ASSET " + so.name + "\n"); Dump(sb, so, " "); }
}
foreach (var guid in AssetDatabase.FindAssets("t:MonoScript", new[] { Root() }))
{
var ms = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid));
var t = ms != null ? ms.GetClass() : null;
if (t == null) continue;
sb.Append("TYPE " + t.FullName + " : " + t.BaseType?.Name + "\n");
foreach (var m in t.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly))
sb.Append(" method " + m + "\n");
foreach (var f in t.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly))
sb.Append(" field " + f.FieldType.Name + " " + f.Name + "\n");
}
System.IO.File.WriteAllText("Library/AFXInspect.txt", sb.ToString());
Debug.Log(sb.ToString());
}
static string Root()
{
foreach (var guid in AssetDatabase.FindAssets("FishMotion t:MonoScript"))
{
var p = AssetDatabase.GUIDToAssetPath(guid);
var parts = p.Split('/');
return parts.Length > 2 ? parts[0] + "/" + parts[1] : "Assets";
}
return "Assets";
}
static void Dump(StringBuilder sb, Object o, string ind)
{
if (o == null) { sb.Append(ind + "(missing)\n"); return; }
sb.Append(ind + o.GetType().Name + "\n");
if (o is Transform) return;
var so = new SerializedObject(o);
var it = so.GetIterator();
bool enter = true;
while (it.NextVisible(enter))
{
enter = false;
if (it.name == "m_Script") continue;
string v = it.propertyType == SerializedPropertyType.ObjectReference ? (it.objectReferenceValue ? it.objectReferenceValue.name : "null")
: it.propertyType == SerializedPropertyType.Float ? it.floatValue.ToString()
: it.propertyType == SerializedPropertyType.Integer ? it.intValue.ToString()
: it.propertyType == SerializedPropertyType.Boolean ? it.boolValue.ToString()
: it.propertyType == SerializedPropertyType.Enum ? it.enumDisplayNames[Mathf.Clamp(it.enumValueIndex, 0, it.enumDisplayNames.Length - 1)]
: it.propertyType.ToString();
sb.Append(ind + " " + it.name + " = " + v + "\n");
}
}
}