namespace SRDebugger.Internal { using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using SRF.Helpers; using UnityEngine; using UnityEngine.EventSystems; public static class SRDebuggerUtil { public static bool IsMobilePlatform { get { if (Application.isMobilePlatform) { return true; } switch (Application.platform) { #if UNITY_5 || UNITY_5_3_OR_NEWER case RuntimePlatform.WSAPlayerARM: case RuntimePlatform.WSAPlayerX64: case RuntimePlatform.WSAPlayerX86: #else case RuntimePlatform.MetroPlayerARM: case RuntimePlatform.MetroPlayerX64: case RuntimePlatform.MetroPlayerX86: #endif return true; default: return false; } } } /// /// If no event system exists, create one /// /// True if the event system was created as a result of this call public static bool EnsureEventSystemExists() { if (!Settings.Instance.EnableEventSystemGeneration) { return false; } if (EventSystem.current != null) { return false; } var e = Object.FindObjectOfType(); // Check if EventSystem is in the scene but not registered yet if (e != null && e.gameObject.activeSelf && e.enabled) { return false; } Debug.LogWarning("[SRDebugger] No EventSystem found in scene - creating a default one. Disable this behaviour in Window -> SRDebugger -> Settings Window -> Advanced)"); CreateDefaultEventSystem(); return true; } public static void CreateDefaultEventSystem() { var go = new GameObject("EventSystem (Created by SRDebugger, disable in Window -> SRDebugger -> Settings Window -> Advanced)"); go.AddComponent(); #if ENABLE_INPUT_SYSTEM && ENABLE_LEGACY_INPUT_MANAGER switch (Settings.Instance.UIInputMode) { case Settings.UIModes.NewInputSystem: AddInputSystem(go); Debug.LogWarning("[SRDebugger] Automatically generated EventSystem is using Unity Input System (can be changed to use Legacy Input in Window -> SRDebugger -> Settings Window -> Advanced)"); break; case Settings.UIModes.LegacyInputSystem: AddLegacyInputSystem(go); Debug.LogWarning("[SRDebugger] Automatically generated EventSystem is using Legacy Input (can be changed to use Unity Input System in Window -> SRDebugger -> Settings Window -> Advanced)"); break; } #elif ENABLE_INPUT_SYSTEM AddInputSystem(go); #elif ENABLE_LEGACY_INPUT_MANAGER || (!ENABLE_INPUT_SYSTEM && !UNITY_2019_3_OR_NEWER) AddLegacyInputSystem(go); #endif } #if ENABLE_INPUT_SYSTEM private static void AddInputSystem(GameObject go) { go.AddComponent(); // Disable/re-enable to force some initialization. // fix for input not being recognized until component is toggled off then on go.SetActive(false); go.SetActive(true); } #endif #if ENABLE_LEGACY_INPUT_MANAGER || (!ENABLE_INPUT_SYSTEM && !UNITY_2019_3_OR_NEWER) private static void AddLegacyInputSystem(GameObject go) { go.AddComponent(); } #endif /// /// Scan for valid options and return a collection of them. /// /// /// public static List ScanForOptions(object obj) { var options = new List(); #if NETFX_CORE var members = obj.GetType().GetTypeInfo().DeclaredMembers; #else var members = obj.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.SetProperty | BindingFlags.InvokeMethod); #endif foreach (var memberInfo in members) { // Find user-specified category name from attribute var categoryAttribute = SRReflection.GetAttribute(memberInfo); var category = categoryAttribute == null ? "Default" : categoryAttribute.Category; // Find user-specified sorting priority from attribute var sortAttribute = SRReflection.GetAttribute(memberInfo); var sortPriority = sortAttribute == null ? 0 : sortAttribute.SortPriority; // Find user-specified display name from attribute var nameAttribute = SRReflection.GetAttribute(memberInfo); var name = nameAttribute == null ? memberInfo.Name : nameAttribute.DisplayName; if (memberInfo is PropertyInfo) { var propertyInfo = memberInfo as PropertyInfo; // Only allow properties with public read/write #if NETFX_CORE if(propertyInfo.GetMethod == null) continue; // Ignore static members if (propertyInfo.GetMethod.IsStatic) continue; #else if (propertyInfo.GetGetMethod() == null) { continue; } // Ignore static members if ((propertyInfo.GetGetMethod().Attributes & MethodAttributes.Static) != 0) { continue; } #endif options.Add(new OptionDefinition(name, category, sortPriority, new SRF.Helpers.PropertyReference(obj, propertyInfo))); } else if (memberInfo is MethodInfo) { var methodInfo = memberInfo as MethodInfo; if (methodInfo.IsStatic) { continue; } // Skip methods with parameters or non-void return type if (methodInfo.ReturnType != typeof (void) || methodInfo.GetParameters().Length > 0) { continue; } options.Add(new OptionDefinition(name, category, sortPriority, new SRF.Helpers.MethodReference(obj, methodInfo))); } } return options; } public static string GetNumberString(int value, int max, string exceedsMaxString) { if (value >= max) { return exceedsMaxString; } return value.ToString(); } public static void ConfigureCanvas(Canvas canvas) { if (Settings.Instance.UseDebugCamera) { canvas.worldCamera = Service.DebugCamera.Camera; canvas.renderMode = RenderMode.ScreenSpaceCamera; } } } }