Guest User

Untitled

a guest
Mar 21st, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. private const float TOTAL_STARS_SHARE = 100.0f; //total share of all stars
  2.  
  3. // #0
  4. [Tooltip("Share of Blue Star Hard prefabs in percentages.")]
  5. [Range(0f, 100f)]
  6. [SerializeField]
  7. private float shareOfBlueStarHard;
  8. private float shareOfBlueStarHardCACHE; //cache for value with same name
  9.  
  10. // #1
  11. [Tooltip("Share of Blue Star Medium prefabs in percentages.")]
  12. [Range(0f, 100f)]
  13. [SerializeField]
  14. private float shareOfBlueStarMedium;
  15. private float shareOfBlueStarMediumCACHE; //cache for value with same name
  16.  
  17. // #2
  18. [Tooltip("Share of Blue Star Soft prefabs in percentages.")]
  19. [Range(0f, 100f)]
  20. [SerializeField]
  21. private float shareOfBlueStarSoft;
  22. private float shareOfBlueStarSoftCACHE; //cache for value with same name
  23.  
  24. // #3
  25. [Tooltip("Share of Red Star Soft prefabs in percentages.")]
  26. [Range(0f, 100f)]
  27. [SerializeField]
  28. private float shareOfRedStarSoft;
  29. private float shareOfRedStarSoftCACHE; //cache for value with same name
  30.  
  31. // #4
  32. [Tooltip("Share of White Star Hard prefabs in percentages.")]
  33. [Range(0f, 100f)]
  34. [SerializeField]
  35. private float shareOfWhiteStarHard;
  36. private float shareOfWhiteStarHardCACHE; //cache for value with same name
  37.  
  38. // #5
  39. [Tooltip("Share of White Star Medium prefabs in percentages.")]
  40. [Range(0f, 100f)]
  41. [SerializeField]
  42. private float shareOfWhiteStarMedium;
  43. private float shareOfWhiteStarMediumCACHE; //cache for value with same name
  44.  
  45. // #6
  46. [Tooltip("Share of White Star Soft prefabs in percentages.")]
  47. [Range(0f, 100f)]
  48. [SerializeField]
  49. private float shareOfWhiteStarSoft;
  50. private float shareOfWhiteStarSoftCACHE; //cache for value with same name
  51.  
  52. // #7
  53. [Tooltip("Share of Yellow Star Soft prefabs in percentages.")]
  54. [Range(0f, 100f)]
  55. [SerializeField]
  56. private float shareOfYellowStarSoft;
  57. private float shareOfYellowStarSoftCACHE; //cache for value with same name
  58.  
  59. /* Controls sliders for stars shares in Unity Inspector. Doesn't work in actual game.*/
  60. #if UNITY_EDITOR
  61. private void OnValidate()
  62. {
  63. ValidateStarsShares();
  64.  
  65. }
  66.  
  67. private void ValidateStarsShares() // Find which value the user changed, and update the rest from it.
  68. {
  69. // Skip this if we haven't cached the values yet.
  70. if (shareOfBlueStarHardCACHE >= 0)
  71. {
  72.  
  73. // Find which value the user changed, and update the rest from it.
  74. if (shareOfBlueStarHardCACHE != shareOfBlueStarHard) // #0 star share changed
  75. {
  76. DistributeProportionatelyForStars(ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfBlueStarSoft, ref shareOfRedStarSoft,
  77. ref shareOfWhiteStarHard, ref shareOfWhiteStarMedium, ref shareOfWhiteStarSoft, ref shareOfYellowStarSoft);
  78. }
  79. else if (shareOfBlueStarMediumCACHE != shareOfBlueStarMedium) // #1 star share changed
  80. {
  81. DistributeProportionatelyForStars(ref shareOfBlueStarMedium, ref shareOfBlueStarHard, ref shareOfBlueStarSoft, ref shareOfRedStarSoft,
  82. ref shareOfWhiteStarHard, ref shareOfWhiteStarMedium, ref shareOfWhiteStarSoft, ref shareOfYellowStarSoft);
  83. }
  84. else if (shareOfBlueStarSoftCACHE != shareOfBlueStarSoft) // #2 star share changed
  85. {
  86. DistributeProportionatelyForStars(ref shareOfBlueStarSoft, ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfRedStarSoft,
  87. ref shareOfWhiteStarHard, ref shareOfWhiteStarMedium, ref shareOfWhiteStarSoft, ref shareOfYellowStarSoft);
  88. }
  89. else if (shareOfRedStarSoftCACHE != shareOfRedStarSoft) // #3 star share changed
  90. {
  91. DistributeProportionatelyForStars(ref shareOfRedStarSoft, ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfBlueStarSoft,
  92. ref shareOfWhiteStarHard, ref shareOfWhiteStarMedium, ref shareOfWhiteStarSoft, ref shareOfYellowStarSoft);
  93. }
  94. else if (shareOfWhiteStarHardCACHE != shareOfWhiteStarHard) // #4 star share changed
  95. {
  96. DistributeProportionatelyForStars(ref shareOfWhiteStarHard, ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfBlueStarSoft,
  97. ref shareOfRedStarSoft, ref shareOfWhiteStarMedium, ref shareOfWhiteStarSoft, ref shareOfYellowStarSoft);
  98. }
  99. else if (shareOfWhiteStarMediumCACHE != shareOfWhiteStarMedium) // #5 star share changed
  100. {
  101. DistributeProportionatelyForStars(ref shareOfWhiteStarMedium, ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfBlueStarSoft,
  102. ref shareOfRedStarSoft, ref shareOfWhiteStarHard, ref shareOfWhiteStarSoft, ref shareOfYellowStarSoft);
  103. }
  104. else if (shareOfWhiteStarSoftCACHE != shareOfWhiteStarSoft) // #6 star share changed
  105. {
  106. DistributeProportionatelyForStars(ref shareOfWhiteStarSoft, ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfBlueStarSoft,
  107. ref shareOfRedStarSoft, ref shareOfWhiteStarHard, ref shareOfWhiteStarMedium, ref shareOfYellowStarSoft);
  108. }
  109. else if (shareOfYellowStarSoftCACHE != shareOfYellowStarSoft) // #7 star share changed
  110. {
  111. DistributeProportionatelyForStars(ref shareOfYellowStarSoft, ref shareOfBlueStarHard, ref shareOfBlueStarMedium, ref shareOfBlueStarSoft,
  112. ref shareOfRedStarSoft, ref shareOfWhiteStarHard, ref shareOfWhiteStarMedium, ref shareOfWhiteStarSoft);
  113. }
  114. }
  115.  
  116. // Cache the old values for the next edit.
  117. shareOfBlueStarHardCACHE = shareOfBlueStarHard;
  118. shareOfBlueStarMediumCACHE = shareOfBlueStarMedium;
  119. shareOfBlueStarSoftCACHE = shareOfBlueStarSoft;
  120. shareOfRedStarSoftCACHE = shareOfRedStarSoft;
  121. shareOfWhiteStarHardCACHE = shareOfWhiteStarHard;
  122. shareOfWhiteStarMediumCACHE = shareOfWhiteStarMedium;
  123. shareOfWhiteStarSoftCACHE = shareOfWhiteStarSoft;
  124. shareOfYellowStarSoftCACHE = shareOfYellowStarSoft;
  125. }
  126.  
  127. void DistributeProportionatelyForStars(ref float changed, ref float one, ref float two, ref float three,
  128. ref float four, ref float five, ref float six, ref float seven)
  129. {
  130. changed = Mathf.Clamp(changed, 0.0f, TOTAL_STARS_SHARE);
  131. float total = TOTAL_STARS_SHARE - changed;
  132.  
  133. float oldTotal = one + two + three + four + five + six + seven;
  134.  
  135. if (oldTotal > 0)
  136. {
  137. float fraction = 1f / oldTotal;
  138. one = Mathf.RoundToInt(total * one * fraction);
  139. two = Mathf.RoundToInt(total * two * fraction);
  140. three = Mathf.RoundToInt(total * three * fraction);
  141. four = Mathf.RoundToInt(total * four * fraction);
  142. five = Mathf.RoundToInt(total * five * fraction);
  143. six = Mathf.RoundToInt(total * six * fraction);
  144. seven = Mathf.RoundToInt(total * seven * fraction);
  145. }
  146. else
  147. {
  148. one = two = three = four = five = six = seven = total / 7;
  149. }
  150.  
  151. // Assign any rounding error to the last one, arbitrarily.
  152. // (Better rounding rules exist, so take this as an example only)
  153. //c += total - a - b - c;
  154. }
  155. #endif
  156.  
  157. [System.Serializable]
  158. public struct PrefabEntry {
  159. #if UNITY_EDITOR
  160. // This helps it look neater in the inspector.
  161. [HideInInspector]
  162. public string name;
  163. #endif
  164. public GameObject prefab;
  165. public float weight;
  166. }
  167.  
  168. [SerializeField]
  169. [HideInInspector]
  170. PrefabEntry[] _normalizedPrefabs;
  171.  
  172. #if UNITY_EDITOR
  173. [SerializeField]
  174. PrefabEntry[] _weightedPrefabs = new PrefabEntry[0];
  175.  
  176. void OnValidate() {
  177. // When the array is modified,
  178. // update all the entries' names,
  179. // and total up the weight accounted for.
  180. float totalWeight = 0f;
  181.  
  182. for(int i = 0; i < _weightedPrefabs.Length; i++) {
  183. var entry = _weightedPrefabs[i];
  184. if(entry.prefab == null)
  185. continue;
  186.  
  187. entry.name = entry.prefab.name;
  188. _weightedPrefabs[i] = entry;
  189. totalWeight += entry.weight;
  190. }
  191.  
  192. if (totalWeight == 0f)
  193. return;
  194.  
  195. float reweight = 100f / totalWeight;
  196.  
  197. // Create/resize the normalized version.
  198. if(_normalizedPrefabs == null || _normalizedPrefabs.Length != _weightedPrefabs.Length)
  199. _normalizedPrefabs = new PrefabEntry [_weightedPrefabs.Length];
  200.  
  201. // Fill this array with copies of the original,
  202. // reweighted to add up to 100
  203. for(int i = 0; i < _weightedPrefabs.Length; i++) {
  204. var entry = _weightedPrefabs[i];
  205. if(entry.prefab == null)
  206. entry.weight = 0f;
  207.  
  208. entry.weight *= reweight;
  209. _normalizedPrefabs[i] = entry;
  210. }
  211. }
  212. #endif
Add Comment
Please, Sign In to add comment