SceneEventCfg.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public enum SceneEventPointType
  5. {
  6. Fixed = 1, //固定不可随机点
  7. Random = 2, //随机点位置
  8. }
  9. public class SceneEventCfg : MonoBehaviour
  10. {
  11. [System.Serializable]
  12. public struct SceneEventPoint
  13. {
  14. public Transform point;
  15. public SceneEventPointType pointType;
  16. public int eventId;
  17. public int showRate;
  18. }
  19. public SceneEventPoint[] sceneEventPoints = null;
  20. public SceneEvent[] sceneEvents = null;
  21. public int AvaliablePointNum = 1;
  22. HashSet<int> mArrangedPoints = new HashSet<int>();
  23. // Use this for initialization
  24. void Start()
  25. {
  26. DisableAllEvents();
  27. SetSceneEvent();
  28. }
  29. List<SceneEvent> randomEvents = new List<SceneEvent>();
  30. public void SetSceneEvent()
  31. {
  32. if (sceneEvents == null || sceneEventPoints == null) return;
  33. ResetData();
  34. for (int idx =0; idx < sceneEventPoints.Length;idx++)
  35. {
  36. if(sceneEventPoints[idx].pointType == SceneEventPointType.Fixed)
  37. {
  38. SceneEvent se = GetEvent(sceneEventPoints[idx].eventId);
  39. if(se!=null)
  40. {
  41. se.transform.SetParent(sceneEventPoints[idx].point);
  42. se.transform.localPosition = Vector3.zero;
  43. int rand = Random.Range(1, 100);
  44. if (rand < sceneEventPoints[idx].showRate)
  45. se.Show();
  46. else
  47. se.Hide();
  48. se.EventPointPos = idx;
  49. mArrangedPoints.Add(idx);
  50. }
  51. }
  52. }
  53. randomEvents.Clear();
  54. for(int idx =0; idx < sceneEvents.Length;idx++)
  55. {
  56. if(!sceneEvents[idx].IsArrange)
  57. randomEvents.Add(sceneEvents[idx]);
  58. }
  59. int cnt = AvaliablePointNum;
  60. while(cnt >0)
  61. {
  62. if (randomEvents.Count == 0) break;
  63. if (!ExistIdlePoint()) break;
  64. int eIdx = Random.Range(0, randomEvents.Count);
  65. SceneEvent se = randomEvents[eIdx];
  66. randomEvents.RemoveAt(eIdx);
  67. int idlePointIdx = GetRandleIdlePoint(se.canUsePoints);
  68. se.transform.SetParent(sceneEventPoints[idlePointIdx].point);
  69. se.transform.localPosition = Vector3.zero;
  70. se.EventPointPos = idlePointIdx;
  71. se.Show();
  72. mArrangedPoints.Add(idlePointIdx);
  73. cnt--;
  74. }
  75. }
  76. private void ResetData()
  77. {
  78. mArrangedPoints.Clear();
  79. for(int idx = 0;idx < sceneEvents.Length;idx++)
  80. {
  81. sceneEvents[idx].Hide();
  82. sceneEvents[idx].EventPointPos = -1;
  83. }
  84. }
  85. SceneEvent GetEvent(int eventId)
  86. {
  87. if (sceneEvents == null) return null;
  88. for(int idx = 0; idx < sceneEvents.Length;idx++)
  89. {
  90. if (sceneEvents[idx].EventId == eventId) return sceneEvents[idx];
  91. }
  92. return null;
  93. }
  94. void DisableAllEvents()
  95. {
  96. if(sceneEvents!=null)
  97. {
  98. for (int idx = 0; idx < sceneEvents.Length; idx++)
  99. {
  100. sceneEvents[idx].enabled = false;
  101. if(sceneEvents[idx].EventTarget!=null)
  102. sceneEvents[idx].EventTarget.gameObject.SetActive(true);
  103. }
  104. }
  105. }
  106. bool ExistIdlePoint()
  107. {
  108. if (sceneEventPoints == null) return false;
  109. return mArrangedPoints.Count < sceneEventPoints.Length;
  110. }
  111. List<int> temp = new List<int>();
  112. int GetRandleIdlePoint(int[] canUsePoints)
  113. {
  114. temp.Clear();
  115. int cnt = sceneEventPoints.Length;
  116. for (int idx = 0; idx < cnt; idx++)
  117. {
  118. if (mArrangedPoints.Contains(idx)) continue;
  119. temp.Add(idx);
  120. }
  121. int randomIdx = Random.Range(0, temp.Count);
  122. int result = temp[randomIdx];
  123. return result;
  124. }
  125. #if UNITY_EDITOR
  126. private void OnDrawGizmos()
  127. {
  128. if(sceneEventPoints!=null)
  129. {
  130. for (int idx =0; idx < sceneEventPoints.Length;idx++)
  131. {
  132. SceneEventPoint p = sceneEventPoints[idx];
  133. if(p.point!=null)
  134. {
  135. if (p.pointType == SceneEventPointType.Fixed)
  136. {
  137. Gizmos.color = Color.red;
  138. Gizmos.DrawSphere(p.point.position, 0.5f);
  139. }
  140. else {
  141. Gizmos.color = Color.green;
  142. Gizmos.DrawSphere(p.point.position, 0.5f);
  143. }
  144. }
  145. }
  146. }
  147. if(sceneEvents!=null)
  148. {
  149. for(int idx =0; idx <sceneEvents.Length;idx++)
  150. {
  151. SceneEvent se = sceneEvents[idx];
  152. if(se!=null)
  153. {
  154. if(se.EventType == SceneEventType.Unmovable)
  155. {
  156. Gizmos.color = Color.gray;
  157. Gizmos.DrawSphere(se.transform.position, 0.5f);
  158. }
  159. else
  160. {
  161. if(se.MovePaths!=null)
  162. {
  163. Gizmos.color = Color.yellow;
  164. for (int jdx = 0; jdx < se.MovePaths.Length;jdx++)
  165. {
  166. var path = se.MovePaths[jdx];
  167. Gizmos.DrawLine(path.startPoint.position, path.endPoint.position);
  168. }
  169. }
  170. }
  171. }
  172. }
  173. }
  174. }
  175. #endif
  176. }