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;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |