ProbabilityList.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace HQFPSWeapons
  5. {
  6. [Serializable]
  7. public class ProbabilityList<T> where T : UnityEngine.Object
  8. {
  9. public int Count { get { return m_Items.Count; } }
  10. [SerializeField]
  11. private List<T> m_Items = null;
  12. [SerializeField]
  13. private List<int> m_Probabilities = null;
  14. public T GetRandomItem()
  15. {
  16. if(m_Items.Count > 0)
  17. return m_Items[ProbabilityUtils.RandomChoiceFollowingDistribution(m_Probabilities.ConvertAll((int p)=> { return (float)p; }))];
  18. else
  19. return default(T);
  20. }
  21. public bool GetRandomItems(int iterations, out T[] items)
  22. {
  23. iterations = Mathf.Clamp(iterations, 0, m_Items.Count / 2);
  24. if(iterations > 0)
  25. {
  26. items = new T[iterations];
  27. var clonedElements = new List<ProbabilityElement>();
  28. for(int e = 0;e < m_Items.Count;e ++)
  29. clonedElements.Add(new ProbabilityElement() { Item = m_Items[e], Probability = ((float)m_Probabilities[e]) / 100f });
  30. for(int i = 0;i < iterations;i ++)
  31. {
  32. int chosenElement = GetRandomItem(clonedElements);
  33. items[i] = m_Items[chosenElement];
  34. clonedElements.RemoveAt(chosenElement);
  35. }
  36. return true;
  37. }
  38. else
  39. {
  40. items = default(T[]);
  41. return false;
  42. }
  43. }
  44. private int GetRandomItem(List<ProbabilityElement> elements)
  45. {
  46. var probabilities = new List<float>();
  47. for(int i = 0;i < elements.Count;i ++)
  48. probabilities.Add(elements[i].Probability);
  49. return ProbabilityUtils.RandomChoiceFollowingDistribution(probabilities);
  50. }
  51. #region Internal
  52. [Serializable]
  53. public struct ProbabilityElement
  54. {
  55. public T Item;
  56. public float Probability;
  57. }
  58. #endregion
  59. }
  60. [Serializable]
  61. public class ItemPickupRandomList : ProbabilityList<ItemPickup> { }
  62. }