using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace RunlevelSystems.DevPlus1.EditorTools { public class RLProjectAnalyzerWindow : EditorWindow { private RLProjectAnalysisData data = new RLProjectAnalysisData(); private string lastRunTime = "Not run yet"; private Vector2 scroll; [MenuItem("Runlevel Systems/DevPlus1/Analyze Unity Project")] public static void ShowWindow() { RLProjectAnalyzerWindow window = GetWindow("Runlevel DevPlus1 Project Analyzer"); window.minSize = new Vector2(520f, 520f); } [MenuItem("Runlevel Systems/DevPlus1/Open Report Folder")] public static void OpenReportFolder() { RLReportExporter.RevealReportFolder(); } [MenuItem("Runlevel Systems/DevPlus1/Refresh Git Reports")] public static void RefreshGitReportsMenu() { RLGitReportSummary git = RLGitReportImporter.ImportGitReports(); RLReportExporter.WriteGitSummary(git); AssetDatabase.Refresh(); Debug.Log("Runlevel DevPlus1 Git report summary refreshed."); } private void OnEnable() { RLReportExporter.EnsureFolders(); data.projectName = Application.productName; data.unityVersion = Application.unityVersion; } private void OnGUI() { scroll = EditorGUILayout.BeginScrollView(scroll); EditorGUILayout.LabelField("Runlevel DevPlus1 Project Analyzer", EditorStyles.boldLabel); EditorGUILayout.Space(); if (GUILayout.Button("Import Git Reports")) ImportGitReports(); if (GUILayout.Button("Analyze Open Scene")) AnalyzeOpenScenes(); if (GUILayout.Button("Analyze Build Settings Scenes")) AnalyzeBuildSettingsScenes(); if (GUILayout.Button("Analyze All Asset Scenes")) AnalyzeAllAssetScenes(); if (GUILayout.Button("Analyze Prefabs")) AnalyzePrefabs(); if (GUILayout.Button("Analyze Scripts")) AnalyzeScripts(); if (GUILayout.Button("Generate All Reports")) GenerateAllReports(); if (GUILayout.Button("Open Reports Folder")) RLReportExporter.RevealReportFolder(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Last run time", lastRunTime); EditorGUILayout.LabelField("Scenes analyzed", data.scenes.Count.ToString()); EditorGUILayout.LabelField("Scripts analyzed", data.scripts.Count.ToString()); EditorGUILayout.LabelField("Prefabs analyzed", data.prefabs.Count.ToString()); EditorGUILayout.LabelField("Missing script count", CountMissingScripts().ToString()); EditorGUILayout.LabelField("Missing reference count", CountMissingReferences().ToString()); EditorGUILayout.LabelField("Report folder path", RLReportExporter.AbsoluteReportFolder); EditorGUILayout.EndScrollView(); } private void ImportGitReports() { data.gitReports = RLGitReportImporter.ImportGitReports(); RLReportExporter.WriteGitSummary(data.gitReports); MarkRun(); } private void AnalyzeOpenScenes() { data.scenes = RLSceneAnalyzer.AnalyzeOpenScenes(); MarkRun(); } private void AnalyzeBuildSettingsScenes() { data.scenes = RLSceneAnalyzer.AnalyzeBuildSettingsScenes(); MarkRun(); } private void AnalyzeAllAssetScenes() { data.scenes = RLSceneAnalyzer.AnalyzeAllAssetScenes(); MarkRun(); } private void AnalyzePrefabs() { data.prefabs = RLPrefabAnalyzer.AnalyzePrefabs(); MarkRun(); } private void AnalyzeScripts() { data.scripts = RLScriptAnalyzer.AnalyzeScripts(); MarkRun(); } private void GenerateAllReports() { data.projectName = Application.productName; data.unityVersion = Application.unityVersion; data.generatedAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); data.gitReports = RLGitReportImporter.ImportGitReports(); data.scenes = RLSceneAnalyzer.AnalyzeOpenScenes(); data.prefabs = RLPrefabAnalyzer.AnalyzePrefabs(); data.scripts = RLScriptAnalyzer.AnalyzeScripts(); RLAIContextExporter.EnrichProjectContext(data); RLReportExporter.ExportAll(data); MarkRun(); Debug.Log("Runlevel DevPlus1 Unity reports generated."); } private void MarkRun() { lastRunTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Repaint(); } private int CountMissingScripts() { int count = 0; foreach (RLSceneInfo scene in data.scenes) count += scene.missingScriptCount; foreach (RLPrefabInfo prefab in data.prefabs) count += prefab.missingScriptCount; return count; } private int CountMissingReferences() { int count = 0; foreach (RLSceneInfo scene in data.scenes) count += scene.missingReferenceCount; foreach (RLPrefabInfo prefab in data.prefabs) count += prefab.missingReferenceCount; return count; } } }