InspectorHelper.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using UnityEngine;
  5. namespace Mirror
  6. {
  7. public static class InspectorHelper
  8. {
  9. /// <summary>Gets all public and private fields for a type</summary>
  10. // deepestBaseType: Stops at this base type (exclusive)
  11. public static IEnumerable<FieldInfo> GetAllFields(Type type, Type deepestBaseType)
  12. {
  13. const BindingFlags publicFields = BindingFlags.Public | BindingFlags.Instance;
  14. const BindingFlags privateFields = BindingFlags.NonPublic | BindingFlags.Instance;
  15. // get public fields (includes fields from base type)
  16. FieldInfo[] allPublicFields = type.GetFields(publicFields);
  17. foreach (FieldInfo field in allPublicFields)
  18. {
  19. yield return field;
  20. }
  21. // get private fields in current type, then move to base type
  22. while (type != null)
  23. {
  24. FieldInfo[] allPrivateFields = type.GetFields(privateFields);
  25. foreach (FieldInfo field in allPrivateFields)
  26. {
  27. yield return field;
  28. }
  29. type = type.BaseType;
  30. // stop early
  31. if (type == deepestBaseType)
  32. {
  33. break;
  34. }
  35. }
  36. }
  37. public static bool IsSyncVar(this FieldInfo field)
  38. {
  39. object[] fieldMarkers = field.GetCustomAttributes(typeof(SyncVarAttribute), true);
  40. return fieldMarkers.Length > 0;
  41. }
  42. public static bool IsSerializeField(this FieldInfo field)
  43. {
  44. object[] fieldMarkers = field.GetCustomAttributes(typeof(SerializeField), true);
  45. return fieldMarkers.Length > 0;
  46. }
  47. public static bool IsVisibleField(this FieldInfo field)
  48. {
  49. return field.IsPublic || IsSerializeField(field);
  50. }
  51. public static bool ImplementsInterface<T>(this FieldInfo field)
  52. {
  53. return typeof(T).IsAssignableFrom(field.FieldType);
  54. }
  55. public static bool HasShowInInspector(this FieldInfo field)
  56. {
  57. object[] fieldMarkers = field.GetCustomAttributes(typeof(ShowInInspectorAttribute), true);
  58. return fieldMarkers.Length > 0;
  59. }
  60. // checks if SyncObject is public or has our custom [ShowInInspector] field
  61. public static bool IsVisibleSyncObject(this FieldInfo field)
  62. {
  63. return field.IsPublic || HasShowInInspector(field);
  64. }
  65. }
  66. }