ProbabilityListDrawer.cs 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using UnityEngine;
  2. using UnityEditor;
  3. namespace HQFPSWeapons
  4. {
  5. public abstract class ProbabilityListDrawer<T> : PropertyDrawer
  6. {
  7. private const float ELEMENT_HEIGHT = 32 + 6;
  8. public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
  9. {
  10. var items = property.FindPropertyRelative("m_Items");
  11. var probabilities = property.FindPropertyRelative("m_Probabilities");
  12. // List label
  13. position.height = 16f;
  14. property.isExpanded = EditorGUI.Foldout(position, property.isExpanded, label, true);
  15. position.y = position.yMax + EditorGUIUtility.standardVerticalSpacing;
  16. if(property.isExpanded)
  17. {
  18. // List size
  19. position.x += 16;
  20. position.width -= 16;
  21. items.arraySize = (int)Mathf.Clamp(EditorGUI.IntField(position, "Size", items.arraySize), 0, 15);
  22. if(probabilities.arraySize != items.arraySize)
  23. probabilities.arraySize = items.arraySize;
  24. position.y = position.yMax + EditorGUIUtility.standardVerticalSpacing;
  25. for(int i = 0;i < items.arraySize;i ++)
  26. DrawElement(new Rect(position.x, position.y + i * ELEMENT_HEIGHT, position.width, ELEMENT_HEIGHT), items.GetArrayElementAtIndex(i), probabilities.GetArrayElementAtIndex(i));
  27. }
  28. }
  29. public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
  30. {
  31. return (property.isExpanded ? (property.FindPropertyRelative("m_Items").arraySize * ELEMENT_HEIGHT + 16 + EditorGUIUtility.standardVerticalSpacing * 2) : 0) + 16;
  32. }
  33. private void DrawElement(Rect position, SerializedProperty item, SerializedProperty probability)
  34. {
  35. GUI.Box(position, "");
  36. position.height = 16;
  37. position.y += EditorGUIUtility.standardVerticalSpacing;
  38. EditorGUI.PropertyField(position, item, new GUIContent("Element"));
  39. position.y = position.yMax + EditorGUIUtility.standardVerticalSpacing;
  40. EditorGUI.IntSlider(position, probability, 0, 100, new GUIContent("Probability"));
  41. }
  42. }
  43. [CustomPropertyDrawer(typeof(ItemPickupRandomList))]
  44. public class ItemPickupRandomListDrawer : ProbabilityListDrawer<ItemPickupRandomList> { }
  45. }