using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using SynapticAIPro; using UnityEditor; using System.Text; using Newtonsoft.Json; namespace SynapticPro { /// /// Unity project settings detailed retrieval and manipulation system /// Provides complete information for Build Settings, Player Settings, Quality Settings, etc. /// public static class NexusProjectSettings { #region Build Settings /// /// Get detailed information for Build Settings /// public static string GetBuildSettings() { try { var buildSettings = new Dictionary(); // Basic settings buildSettings["target_group"] = EditorUserBuildSettings.selectedBuildTargetGroup.ToString(); buildSettings["build_target"] = EditorUserBuildSettings.activeBuildTarget.ToString(); buildSettings["development_build"] = EditorUserBuildSettings.development; buildSettings["auto_connect_profiler"] = EditorUserBuildSettings.connectProfiler; buildSettings["deep_profiling"] = EditorUserBuildSettings.buildWithDeepProfilingSupport; buildSettings["script_debugging"] = EditorUserBuildSettings.allowDebugging; // Scene settings var scenes = EditorBuildSettings.scenes; var sceneList = new List>(); for (int i = 0; i < scenes.Length; i++) { var scene = scenes[i]; sceneList.Add(new Dictionary { ["index"] = i, ["path"] = scene.path, ["enabled"] = scene.enabled, ["guid"] = scene.guid.ToString() }); } buildSettings["scenes"] = sceneList; // Platform-specific settings var platformSettings = new Dictionary(); // Android settings if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) { platformSettings["android"] = new Dictionary { ["build_system"] = EditorUserBuildSettings.androidBuildSystem.ToString(), ["export_project"] = EditorUserBuildSettings.exportAsGoogleAndroidProject, ["build_app_bundle"] = EditorUserBuildSettings.buildAppBundle }; } // iOS settings if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS) { platformSettings["ios"] = new Dictionary { ["build_number"] = PlayerSettings.iOS.buildNumber }; } // WebGL settings if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.WebGL) { platformSettings["webgl"] = new Dictionary { // WebGL specific settings would go here }; } buildSettings["platform_settings"] = platformSettings; return JsonConvert.SerializeObject(buildSettings, Formatting.Indented); } catch (Exception e) { return $"Error getting build settings: {e.Message}"; } } #endregion #region Player Settings /// /// Get detailed information for Player Settings /// public static string GetPlayerSettings() { try { var playerSettings = new Dictionary(); // Basic information playerSettings["company_name"] = PlayerSettings.companyName; playerSettings["product_name"] = PlayerSettings.productName; playerSettings["version"] = PlayerSettings.bundleVersion; playerSettings["bundle_identifier"] = PlayerSettings.GetApplicationIdentifier(EditorUserBuildSettings.selectedBuildTargetGroup); // Icon & Splash // Default icon handling varies by platform playerSettings["has_default_icon"] = true; playerSettings["use_animated_autorotation"] = PlayerSettings.useAnimatedAutorotation; // Resolution & Display var resolutionSettings = new Dictionary { ["default_is_fullscreen"] = PlayerSettings.defaultIsNativeResolution, ["default_screen_width"] = PlayerSettings.defaultScreenWidth, ["default_screen_height"] = PlayerSettings.defaultScreenHeight, ["run_in_background"] = PlayerSettings.runInBackground, ["capture_single_screen"] = PlayerSettings.captureSingleScreen, // Display resolution dialog removed in newer Unity versions ["use_player_log"] = PlayerSettings.usePlayerLog, ["resize_with_window"] = PlayerSettings.resizableWindow, ["visible_in_background"] = PlayerSettings.visibleInBackground }; playerSettings["resolution_presentation"] = resolutionSettings; // Splash Screen var splashSettings = new Dictionary { ["show_unity_logo"] = PlayerSettings.SplashScreen.showUnityLogo, ["animation_mode"] = PlayerSettings.SplashScreen.animationMode.ToString(), ["background_color"] = ColorToHex(PlayerSettings.SplashScreen.backgroundColor), ["logo_style"] = PlayerSettings.SplashScreen.unityLogoStyle.ToString() }; playerSettings["splash_screen"] = splashSettings; // XR Settings var xrSettings = new Dictionary { // VR support moved to XR Management package }; playerSettings["xr_settings"] = xrSettings; // Publishing Settings var publishingSettings = new Dictionary { ["use_mac_app_store_validation"] = PlayerSettings.useMacAppStoreValidation, // Mac App Store category setting }; playerSettings["publishing_settings"] = publishingSettings; // Configuration var configurationSettings = new Dictionary { ["scripting_backend"] = PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup).ToString(), ["api_compatibility_level"] = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup).ToString(), // Input handling setting varies by Unity version ["il2cpp_compiler_configuration"] = PlayerSettings.GetIl2CppCompilerConfiguration(EditorUserBuildSettings.selectedBuildTargetGroup).ToString() }; playerSettings["configuration"] = configurationSettings; // Platform-specific settings var platformSpecific = GetPlatformSpecificPlayerSettings(); playerSettings["platform_specific"] = platformSpecific; return JsonConvert.SerializeObject(playerSettings, Formatting.Indented); } catch (Exception e) { return $"Error getting player settings: {e.Message}"; } } private static Dictionary GetPlatformSpecificPlayerSettings() { var platformSettings = new Dictionary(); // Android-specific settings var androidSettings = new Dictionary { ["bundle_version_code"] = PlayerSettings.Android.bundleVersionCode, ["min_sdk_version"] = PlayerSettings.Android.minSdkVersion.ToString(), ["target_sdk_version"] = PlayerSettings.Android.targetSdkVersion.ToString(), ["preferred_install_location"] = PlayerSettings.Android.preferredInstallLocation.ToString(), ["force_internet_permission"] = PlayerSettings.Android.forceInternetPermission, ["force_sd_card_permission"] = PlayerSettings.Android.forceSDCardPermission, ["keystore_name"] = PlayerSettings.Android.keystoreName, ["keystore_pass"] = "[PROTECTED]", ["keyalias_name"] = PlayerSettings.Android.keyaliasName, ["use_custom_keystore"] = PlayerSettings.Android.useCustomKeystore }; platformSettings["android"] = androidSettings; // iOS-specific settings var iosSettings = new Dictionary { ["build_number"] = PlayerSettings.iOS.buildNumber, ["target_os_version"] = PlayerSettings.iOS.targetOSVersionString, ["camera_usage_description"] = PlayerSettings.iOS.cameraUsageDescription, ["location_usage_description"] = PlayerSettings.iOS.locationUsageDescription, ["microphone_usage_description"] = PlayerSettings.iOS.microphoneUsageDescription, ["requires_persistent_wifi"] = PlayerSettings.iOS.requiresPersistentWiFi, // Exit on suspend deprecated, use appInBackgroundBehavior instead ["app_in_background_behavior"] = PlayerSettings.iOS.appInBackgroundBehavior.ToString() }; platformSettings["ios"] = iosSettings; return platformSettings; } #endregion #region Quality Settings /// /// Get detailed information for Quality Settings /// public static string GetQualitySettings() { try { var qualitySettings = new Dictionary(); // Current quality level qualitySettings["current_level"] = QualitySettings.GetQualityLevel(); qualitySettings["current_level_name"] = QualitySettings.names[QualitySettings.GetQualityLevel()]; // All quality levels var levels = new List>(); string[] names = QualitySettings.names; for (int i = 0; i < names.Length; i++) { // Temporarily switch level to retrieve settings int currentLevel = QualitySettings.GetQualityLevel(); QualitySettings.SetQualityLevel(i, false); var levelSettings = new Dictionary { ["index"] = i, ["name"] = names[i], ["pixel_light_count"] = QualitySettings.pixelLightCount, #if UNITY_2022_2_OR_NEWER ["texture_quality"] = QualitySettings.globalTextureMipmapLimit, #else ["texture_quality"] = QualitySettings.masterTextureLimit, #endif ["anisotropic_textures"] = QualitySettings.anisotropicFiltering.ToString(), ["anti_aliasing"] = QualitySettings.antiAliasing, ["soft_particles"] = QualitySettings.softParticles, ["realtime_reflection_probes"] = QualitySettings.realtimeReflectionProbes, ["billboard_face_camera_position"] = QualitySettings.billboardsFaceCameraPosition, ["resolution_scaling_fixed_dpi_factor"] = QualitySettings.resolutionScalingFixedDPIFactor, ["texture_streaming_enabled"] = QualitySettings.streamingMipmapsActive, ["texture_streaming_memory_budget"] = QualitySettings.streamingMipmapsMemoryBudget, ["maximum_lod_bias"] = QualitySettings.maximumLODLevel, ["particle_raycast_budget"] = QualitySettings.particleRaycastBudget, ["async_upload_time_slice"] = QualitySettings.asyncUploadTimeSlice, ["async_upload_buffer_size"] = QualitySettings.asyncUploadBufferSize, ["async_upload_persistent_buffer"] = QualitySettings.asyncUploadPersistentBuffer, ["realtime_gi_cpu_usage"] = QualitySettings.realtimeGICPUUsage.ToString(), ["skinned_mesh_max_bone_count"] = QualitySettings.skinWeights.ToString() }; levels.Add(levelSettings); // Restore original level QualitySettings.SetQualityLevel(currentLevel, false); } qualitySettings["levels"] = levels; // Detail settings var detailSettings = new Dictionary { ["blend_weights"] = QualitySettings.skinWeights.ToString(), ["vsync_count"] = QualitySettings.vSyncCount, ["lod_bias"] = QualitySettings.lodBias, ["maximum_lod_level"] = QualitySettings.maximumLODLevel, ["particle_raycast_budget"] = QualitySettings.particleRaycastBudget, ["soft_vegetation"] = QualitySettings.softVegetation }; qualitySettings["detail_settings"] = detailSettings; return JsonConvert.SerializeObject(qualitySettings, Formatting.Indented); } catch (Exception e) { return $"Error getting quality settings: {e.Message}"; } } #endregion #region Input Settings /// /// Get detailed information for Input Settings /// public static string GetInputSettings() { try { var inputSettings = new Dictionary(); // Input system settings // Input handling setting varies by Unity version inputSettings["input_system_available"] = true; // Legacy Input Manager settings var axes = new List>(); // Get Axes settings from Input Manager (using Reflection) var inputManagerAssets = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/InputManager.asset"); if (inputManagerAssets == null || inputManagerAssets.Length == 0) { SynLog.Warn("[GetInputSettings] InputManager asset not found"); inputSettings["input_axes"] = new List>(); } else { var inputManagerAsset = inputManagerAssets[0]; if (inputManagerAsset == null) { SynLog.Warn("[GetInputSettings] InputManager asset is null"); inputSettings["input_axes"] = new List>(); } else { var serializedObject = new SerializedObject(inputManagerAsset); var axesProperty = serializedObject.FindProperty("m_Axes"); if (axesProperty == null) { SynLog.Warn("[GetInputSettings] m_Axes property not found"); inputSettings["input_axes"] = new List>(); } else { for (int i = 0; i < axesProperty.arraySize; i++) { try { var axis = axesProperty.GetArrayElementAtIndex(i); if (axis != null) { var axisData = new Dictionary { ["name"] = axis.FindPropertyRelative("m_Name")?.stringValue ?? "", ["descriptive_name"] = axis.FindPropertyRelative("m_DescriptiveName")?.stringValue ?? "", ["descriptive_negative_name"] = axis.FindPropertyRelative("m_DescriptiveNegativeName")?.stringValue ?? "", ["negative_button"] = axis.FindPropertyRelative("m_NegativeButton")?.stringValue ?? "", ["positive_button"] = axis.FindPropertyRelative("m_PositiveButton")?.stringValue ?? "", ["alt_negative_button"] = axis.FindPropertyRelative("m_AltNegativeButton")?.stringValue ?? "", ["alt_positive_button"] = axis.FindPropertyRelative("m_AltPositiveButton")?.stringValue ?? "", ["gravity"] = axis.FindPropertyRelative("m_Gravity")?.floatValue ?? 0f, ["dead"] = axis.FindPropertyRelative("m_Dead")?.floatValue ?? 0f, ["sensitivity"] = axis.FindPropertyRelative("m_Sensitivity")?.floatValue ?? 1f, ["snap"] = axis.FindPropertyRelative("m_Snap")?.boolValue ?? false, ["invert"] = axis.FindPropertyRelative("m_Invert")?.boolValue ?? false, ["type"] = axis.FindPropertyRelative("m_Type")?.intValue ?? 0, ["axis"] = axis.FindPropertyRelative("m_Axis")?.intValue ?? 0, ["joy_num"] = axis.FindPropertyRelative("m_JoyNum")?.intValue ?? 0 }; axes.Add(axisData); } } catch (Exception axisEx) { SynLog.Warn($"[GetInputSettings] Failed to read axis {i}: {axisEx.Message}"); } } inputSettings["input_axes"] = axes; } } } // New Input System information (if available) #if UNITY_INPUT_SYSTEM_MODULE_ENABLED try { inputSettings["new_input_system"] = new Dictionary { ["enabled"] = true, ["version"] = UnityEngine.InputSystem.InputSystem.version }; } catch { inputSettings["new_input_system"] = new Dictionary { ["enabled"] = false, ["error"] = "Input System package not available" }; } #else inputSettings["new_input_system"] = new Dictionary { ["enabled"] = false, ["note"] = "Input System module not enabled" }; #endif return JsonConvert.SerializeObject(inputSettings, Formatting.Indented); } catch (Exception e) { return $"Error getting input settings: {e.Message}"; } } #endregion #region Physics Settings /// /// Get detailed information for Physics Settings /// public static string GetPhysicsSettings() { try { var physicsSettings = new Dictionary(); // Basic physics settings physicsSettings["gravity"] = new Dictionary { ["x"] = Physics.gravity.x, ["y"] = Physics.gravity.y, ["z"] = Physics.gravity.z }; // Default physics material varies by Unity version physicsSettings["has_default_material"] = true; physicsSettings["bounce_threshold"] = Physics.bounceThreshold; physicsSettings["sleep_threshold"] = Physics.sleepThreshold; physicsSettings["default_contact_offset"] = Physics.defaultContactOffset; physicsSettings["default_solver_iterations"] = Physics.defaultSolverIterations; physicsSettings["default_solver_velocity_iterations"] = Physics.defaultSolverVelocityIterations; // Query settings physicsSettings["queries_hit_backfaces"] = Physics.queriesHitBackfaces; physicsSettings["queries_hit_triggers"] = Physics.queriesHitTriggers; physicsSettings["auto_sync_transforms"] = Physics.autoSyncTransforms; physicsSettings["reuse_collision_callbacks"] = Physics.reuseCollisionCallbacks; // Layer collision matrix var layerCollisionMatrix = new Dictionary(); for (int i = 0; i < 32; i++) { var layerName = LayerMask.LayerToName(i); if (!string.IsNullOrEmpty(layerName)) { var collisions = new List(); for (int j = 0; j < 32; j++) { if (!Physics.GetIgnoreLayerCollision(i, j)) { var otherLayerName = LayerMask.LayerToName(j); if (!string.IsNullOrEmpty(otherLayerName)) { collisions.Add(otherLayerName); } } } layerCollisionMatrix[layerName] = collisions; } } physicsSettings["layer_collision_matrix"] = layerCollisionMatrix; // 2D Physics settings var physics2DSettings = new Dictionary { ["gravity"] = new Dictionary { ["x"] = Physics2D.gravity.x, ["y"] = Physics2D.gravity.y }, // Default physics material varies by Unity version ["has_default_material"] = true, ["velocity_iterations"] = Physics2D.velocityIterations, ["position_iterations"] = Physics2D.positionIterations, ["velocity_threshold"] = Physics2D.bounceThreshold, ["max_linear_correction"] = Physics2D.maxLinearCorrection, ["max_angular_correction"] = Physics2D.maxAngularCorrection, ["max_translation_speed"] = Physics2D.maxTranslationSpeed, ["max_rotation_speed"] = Physics2D.maxRotationSpeed, ["baumgarte_scale"] = Physics2D.baumgarteScale, ["baumgarte_time_of_impact_scale"] = Physics2D.baumgarteTOIScale, ["time_to_sleep"] = Physics2D.timeToSleep, ["linear_sleep_tolerance"] = Physics2D.linearSleepTolerance, ["angular_sleep_tolerance"] = Physics2D.angularSleepTolerance, ["auto_sync_transforms"] = Physics2D.autoSyncTransforms, ["reuse_collision_callbacks"] = Physics2D.reuseCollisionCallbacks, // Auto simulation deprecated, use simulationMode instead ["queries_hit_triggers"] = Physics2D.queriesHitTriggers, ["queries_start_in_colliders"] = Physics2D.queriesStartInColliders, ["callbacks_on_disable"] = Physics2D.callbacksOnDisable }; physicsSettings["physics_2d"] = physics2DSettings; return JsonConvert.SerializeObject(physicsSettings, Formatting.Indented); } catch (Exception e) { return $"Error getting physics settings: {e.Message}"; } } #endregion #region Utility Methods private static string ColorToHex(Color color) { return $"#{ColorUtility.ToHtmlStringRGBA(color)}"; } /// /// Get summary of all project settings /// public static string GetProjectSettingsSummary() { try { var summary = new Dictionary { ["project_info"] = new Dictionary { ["product_name"] = PlayerSettings.productName, ["bundle_version"] = PlayerSettings.bundleVersion, ["company_name"] = PlayerSettings.companyName, ["bundle_id"] = PlayerSettings.GetApplicationIdentifier(EditorUserBuildSettings.selectedBuildTargetGroup) }, ["build_settings"] = new Dictionary { ["target_platform"] = EditorUserBuildSettings.activeBuildTarget.ToString(), ["development_build"] = EditorUserBuildSettings.development, ["scripting_backend"] = PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup).ToString() }, ["quality_settings"] = new Dictionary { ["quality_level"] = QualitySettings.names[QualitySettings.GetQualityLevel()], ["vsync_count"] = QualitySettings.vSyncCount, ["anti_aliasing"] = QualitySettings.antiAliasing, ["aniso_filtering"] = QualitySettings.anisotropicFiltering.ToString() }, ["physics_settings"] = new Dictionary { ["gravity_3d"] = new Dictionary { ["x"] = Physics.gravity.x, ["y"] = Physics.gravity.y, ["z"] = Physics.gravity.z }, ["gravity_2d"] = new Dictionary { ["x"] = Physics2D.gravity.x, ["y"] = Physics2D.gravity.y } }, ["statistics"] = GetProjectStatistics() }; return JsonConvert.SerializeObject(summary, Formatting.Indented); } catch (Exception e) { return $"Error getting project settings summary: {e.Message}"; } } /// /// Get project statistics information /// private static Dictionary GetProjectStatistics() { var stats = new Dictionary(); try { // Number of GameObjects (active scene only) var rootObjects = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects(); int totalGameObjects = 0; foreach (var root in rootObjects) { totalGameObjects += CountGameObjectsRecursive(root.transform); } // Asset statistics string[] allAssets = AssetDatabase.GetAllAssetPaths(); var assetTypes = new Dictionary(); foreach (string assetPath in allAssets) { if (assetPath.StartsWith("Assets/")) { string extension = System.IO.Path.GetExtension(assetPath).ToLower(); if (!string.IsNullOrEmpty(extension)) { if (assetTypes.ContainsKey(extension)) assetTypes[extension]++; else assetTypes[extension] = 1; } } } stats["gameobject_count"] = totalGameObjects; stats["script_count"] = assetTypes.ContainsKey(".cs") ? assetTypes[".cs"] : 0; stats["total_assets"] = allAssets.Where(p => p.StartsWith("Assets/")).Count(); stats["asset_types"] = assetTypes; stats["memory_usage"] = new Dictionary { ["allocated_memory"] = UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong(), ["reserved_memory"] = UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong(), ["mono_heap_size"] = UnityEngine.Profiling.Profiler.GetMonoHeapSizeLong(), ["mono_used_size"] = UnityEngine.Profiling.Profiler.GetMonoUsedSizeLong() }; } catch (Exception e) { stats["error"] = e.Message; } return stats; } /// /// Count GameObjects recursively /// private static int CountGameObjectsRecursive(Transform transform) { int count = 1; // Self for (int i = 0; i < transform.childCount; i++) { count += CountGameObjectsRecursive(transform.GetChild(i)); } return count; } #endregion } }