InspectorHelper.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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>
  10. /// Gets all public and private fields for a type
  11. /// </summary>
  12. /// <param name="type"></param>
  13. /// <param name="deepestBaseType">Stops at this base type (exclusive)</param>
  14. /// <returns></returns>
  15. public static IEnumerable<FieldInfo> GetAllFields(Type type, Type deepestBaseType)
  16. {
  17. const BindingFlags publicFields = BindingFlags.Public | BindingFlags.Instance;
  18. const BindingFlags privateFields = BindingFlags.NonPublic | BindingFlags.Instance;
  19. // get public fields (includes fields from base type)
  20. FieldInfo[] allPublicFields = type.GetFields(publicFields);
  21. foreach (FieldInfo field in allPublicFields)
  22. {
  23. yield return field;
  24. }
  25. // get private fields in current type, then move to base type
  26. while (type != null)
  27. {
  28. FieldInfo[] allPrivateFields = type.GetFields(privateFields);
  29. foreach (FieldInfo field in allPrivateFields)
  30. {
  31. yield return field;
  32. }
  33. type = type.BaseType;
  34. // stop early
  35. if (type == deepestBaseType)
  36. {
  37. break;
  38. }
  39. }
  40. }
  41. public static bool IsSyncVar(this FieldInfo field)
  42. {
  43. object[] fieldMarkers = field.GetCustomAttributes(typeof(SyncVarAttribute), true);
  44. return fieldMarkers.Length > 0;
  45. }
  46. public static bool IsSerializeField(this FieldInfo field)
  47. {
  48. object[] fieldMarkers = field.GetCustomAttributes(typeof(SerializeField), true);
  49. return fieldMarkers.Length > 0;
  50. }
  51. public static bool IsVisibleField(this FieldInfo field)
  52. {
  53. return field.IsPublic || IsSerializeField(field);
  54. }
  55. public static bool IsSyncObject(this FieldInfo field)
  56. {
  57. return typeof(SyncObject).IsAssignableFrom(field.FieldType);
  58. }
  59. public static bool HasShowInInspector(this FieldInfo field)
  60. {
  61. object[] fieldMarkers = field.GetCustomAttributes(typeof(ShowInInspectorAttribute), true);
  62. return fieldMarkers.Length > 0;
  63. }
  64. public static bool IsVisibleSyncObject(this FieldInfo field)
  65. {
  66. return field.IsPublic || HasShowInInspector(field);
  67. }
  68. }
  69. }