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"); } } }