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