EquipmentMotionDrawer.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System;
  2. using UnityEngine;
  3. using UnityEditor;
  4. namespace HQFPSWeapons
  5. {
  6. [CustomPropertyDrawer(typeof(EquipmentMotionState))]
  7. public class EquipmentMotionDrawer : PropertyDrawer
  8. {
  9. public static event Action<EquipmentMotionDrawer> EnabledVisualization;
  10. private bool m_Enabled;
  11. private bool m_Visualize;
  12. private float m_VisualizationSpeed = 3f;
  13. private EquipmentPhysics m_MoverComponent;
  14. private EquipmentPhysics.StateType m_StateType;
  15. public override void OnGUI (Rect position, SerializedProperty property, GUIContent label)
  16. {
  17. if(property.isExpanded)
  18. GUI.Box(new Rect(position.x, position.y + 16f, position.width, position.height - 16f), "");
  19. if(!m_Enabled)
  20. OnEnable(property);
  21. EditorGUI.PropertyField(position, property, true);
  22. if(property.isExpanded)
  23. {
  24. if(Application.isPlaying)
  25. {
  26. // Visualize button
  27. position.x += 8f;
  28. position.y = position.yMax - 38f;
  29. position.height = 16f;
  30. position.width -= 16f;
  31. USEditorUtility.DoHorizontalLine(new Rect(position.x, position.y - 4f, position.width, 1f));
  32. GUI.color = m_Visualize ? Color.grey : Color.white;
  33. if(GUI.Button(position, "Visualize"))
  34. {
  35. if(m_MoverComponent != null && m_MoverComponent.enabled && m_MoverComponent.gameObject.activeInHierarchy)
  36. {
  37. m_Visualize = !m_Visualize;
  38. if(m_Visualize)
  39. EnabledVisualization(this);
  40. EquipmentPhysics.StateType stateToVisualize = EquipmentPhysics.StateType.None;
  41. if(m_Visualize)
  42. stateToVisualize = m_StateType;
  43. m_MoverComponent.VisualizeState(stateToVisualize, m_VisualizationSpeed);
  44. }
  45. }
  46. GUI.color = Color.white;
  47. // Visualize speed
  48. position.y = position.yMax + 2f;
  49. m_VisualizationSpeed = EditorGUI.Slider(position, "Speed", m_VisualizationSpeed, 0f, 20f);
  50. }
  51. if(GUI.changed && m_Visualize && m_MoverComponent != null)
  52. m_MoverComponent.VisualizeState(m_StateType, m_VisualizationSpeed);
  53. }
  54. }
  55. public override float GetPropertyHeight (SerializedProperty property, GUIContent label)
  56. {
  57. return EditorGUI.GetPropertyHeight(property) + ((Application.isPlaying && property.isExpanded) ? 44f : 0f);
  58. }
  59. private void OnEnable(SerializedProperty property)
  60. {
  61. EnabledVisualization += On_EnabledVisualization;
  62. Selection.selectionChanged += On_SelectionChanged;
  63. m_MoverComponent = property.serializedObject.targetObject as EquipmentPhysics;
  64. if(property.name == "IdleState")
  65. m_StateType = EquipmentPhysics.StateType.Idle;
  66. else if(property.name == "WalkState")
  67. m_StateType = EquipmentPhysics.StateType.Walk;
  68. else if(property.name == "RunState")
  69. m_StateType = EquipmentPhysics.StateType.Run;
  70. else if(property.name == "AimState")
  71. m_StateType = EquipmentPhysics.StateType.Aim;
  72. else if (property.name == "CrouchState")
  73. m_StateType = EquipmentPhysics.StateType.Crouch;
  74. else if(property.name == "OnLadderState")
  75. m_StateType = EquipmentPhysics.StateType.OnLadder;
  76. else if(property.name == "TooCloseState")
  77. m_StateType = EquipmentPhysics.StateType.Retraction;
  78. m_Enabled = true;
  79. }
  80. private void On_EnabledVisualization(EquipmentMotionDrawer drawer)
  81. {
  82. m_Visualize = (drawer == this);
  83. }
  84. private void On_SelectionChanged()
  85. {
  86. if(m_MoverComponent == null || Selection.activeGameObject == null || Selection.activeGameObject != m_MoverComponent.gameObject)
  87. OnDestroy();
  88. }
  89. private void OnDestroy()
  90. {
  91. EnabledVisualization -= On_EnabledVisualization;
  92. Selection.selectionChanged -= On_SelectionChanged;
  93. if(m_MoverComponent != null)
  94. m_MoverComponent.VisualizeState(EquipmentPhysics.StateType.None);
  95. }
  96. }
  97. }