123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- 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;
- }
- }
- }
- /// <summary>
- /// If no event system exists, create one
- /// </summary>
- /// <returns>True if the event system was created as a result of this call</returns>
- public static bool EnsureEventSystemExists()
- {
- if (!Settings.Instance.EnableEventSystemGeneration)
- {
- return false;
- }
- if (EventSystem.current != null)
- {
- return false;
- }
- var e = Object.FindObjectOfType<EventSystem>();
- // 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<EventSystem>();
- #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<UnityEngine.InputSystem.UI.InputSystemUIInputModule>();
- // 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<StandaloneInputModule>();
- }
- #endif
- /// <summary>
- /// Scan <paramref name="obj" /> for valid options and return a collection of them.
- /// </summary>
- /// <param name="obj"></param>
- /// <returns></returns>
- public static List<OptionDefinition> ScanForOptions(object obj)
- {
- var options = new List<OptionDefinition>();
- #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<CategoryAttribute>(memberInfo);
- var category = categoryAttribute == null ? "Default" : categoryAttribute.Category;
- // Find user-specified sorting priority from attribute
- var sortAttribute = SRReflection.GetAttribute<SortAttribute>(memberInfo);
- var sortPriority = sortAttribute == null ? 0 : sortAttribute.SortPriority;
- // Find user-specified display name from attribute
- var nameAttribute = SRReflection.GetAttribute<DisplayNameAttribute>(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;
- }
- }
- }
- }
|