181 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			181 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | 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>(); | |||
|  |             go.AddComponent<StandaloneInputModule>(); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Scan <paramref name="obj" /> for valid options and return a collection of them. | |||
|  |         /// </summary> | |||
|  |         /// <param name="obj"></param> | |||
|  |         /// <returns></returns> | |||
|  |         public static ICollection<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; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |