Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.52 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. using UnityEngine.UI;
  6.  
  7. [System.Serializable]
  8. public class Segmento{
  9. public string nameElement;
  10. public GameObject actualSegment;
  11. public int minObstacles;
  12. public int minSmallObstacles;
  13. public int maxObstacles;
  14. public int maxSmallObstacles;
  15. public List<GameObject> possibleObstacles;
  16. public List<GameObject> possibleSmallObstacles;
  17. public List<GameObject> possibleFutureSegments;
  18. }
  19.  
  20. public class LevelManager : MonoBehaviour {
  21. public static LevelManager current;
  22. public GameObject pausePanel;
  23. public Text scoreText, moneyText, scoreTextPause;
  24. public GameObject playerObject, firstSegment;
  25. public int changeBGCounter = 10; //cambiare changeBGCounter in base a quanti segmenti bisogna superare prima di cambiare BG.
  26. public List<Segmento> segmenti;
  27. [HideInInspector]
  28. public int currentMoney = 0;
  29. [HideInInspector]
  30. public int currentScore = 0;
  31. [HideInInspector]
  32. public Segmento lastSegment;
  33. [HideInInspector]
  34. public Queue<GameObject> segmentToDelete;
  35.  
  36. private List<GameObject> possibleSegmentsAfterLast; //questa lista la sostituisco ogni volta nella funzione di spawn mettendoci come elementi solo i possibili segmenti successivi all'ultimo segmento.
  37.  
  38. private GameObject lastSegmentObject;
  39. private int segmentDoneCounter = 0;
  40.  
  41.  
  42. private void Awake()
  43. {
  44. if (current == null)
  45. {
  46. current = this;
  47. }
  48. }
  49.  
  50. private void Start()
  51. {
  52. scoreText.text = "" + 0;
  53. scoreTextPause.text = "" + 0; // score menù pausa
  54. moneyText.text = "MONEY: " + 0 + "$";
  55. segmentToDelete = new Queue<GameObject>();
  56.  
  57. #region first spawn
  58. segmentToDelete.Enqueue(firstSegment);
  59. lastSegment.actualSegment = firstSegment;
  60. possibleSegmentsAfterLast = segmenti[0].possibleFutureSegments;
  61. int indexSegment = Random.Range(0, (possibleSegmentsAfterLast.Count));
  62.  
  63. //primo foreach serve per far spawnare il successivo GAMEOBJECT segmento (in questo caso il primo).
  64. foreach (GameObject nextSegment in possibleSegmentsAfterLast)
  65. {
  66. if (nextSegment == possibleSegmentsAfterLast[indexSegment])
  67. {
  68. GameObject segment = ObjectPooling.current.GetPooledObject(nextSegment);
  69.  
  70. segmentToDelete.Enqueue(segment);
  71. segment.transform.position = new Vector3(0f,7f,0f); //[on] Vas se cambi qualcosa nella posizione dei segmenti devo cambiare questo.
  72. segment.SetActive(true);
  73. segmentDoneCounter++;
  74. //questo foreach serve per salvarci il segmento di tipo SEGMENTO appena spawnato in modo da salvarlo e usare la sua posizione per capire dove potrà spawnare il successivo
  75. foreach (Segmento futureSegment in segmenti)
  76. {
  77. if (futureSegment.actualSegment == nextSegment)
  78. {
  79. lastSegmentObject = segment;
  80. lastSegment = futureSegment;
  81. SpawnObstacles(segment);
  82. }
  83. }
  84. }
  85. }
  86. #endregion
  87.  
  88. }
  89.  
  90.  
  91.  
  92. //spawn con il pooling
  93. public void SpawnSegments() {
  94.  
  95. possibleSegmentsAfterLast = lastSegment.possibleFutureSegments;
  96. int indexSegment = Random.Range(0, (possibleSegmentsAfterLast.Count));
  97. //primo foreach serve per far spawnare il successivo GAMEOBJECT segmento
  98. foreach (GameObject nextSegment in possibleSegmentsAfterLast) {
  99. if(segmentDoneCounter == changeBGCounter) //cambio stage facendo spawnare l'ultimo segmento
  100. {
  101. if (nextSegment.name.Contains("end") && nextSegment.tag == lastSegmentObject.tag) {
  102. GameObject segment = ObjectPooling.current.GetPooledObject(nextSegment);
  103. int boundX = (int)lastSegmentObject.GetComponent<MeshCollider>().bounds.size.x;
  104. segment.transform.position = new Vector3(lastSegmentObject.transform.position.x + boundX, lastSegmentObject.transform.position.y, lastSegmentObject.transform.position.z);
  105. segment.SetActive(true);
  106. SpawnObstacles(segment);
  107. lastSegmentObject = segment;
  108. //questo foreach serve per salvarci il segmento di tipo SEGMENTO appena spawnato in modo da salvarlo e usare la sua posizione per capire dove potrà spawnare il successivo
  109. foreach (Segmento futureSegment in segmenti)
  110. {
  111. if (futureSegment.actualSegment == nextSegment)
  112. {
  113. lastSegment = futureSegment;
  114. }
  115. }
  116. segmentDoneCounter = 0;
  117. }
  118. }
  119. else if (nextSegment == possibleSegmentsAfterLast[indexSegment])
  120. {
  121. GameObject segment = ObjectPooling.current.GetPooledObject(nextSegment);
  122. int boundX = (int)lastSegmentObject.GetComponent<MeshCollider>().bounds.size.x;
  123. segment.transform.position = new Vector3(lastSegmentObject.transform.position.x + boundX, lastSegmentObject.transform.position.y, lastSegmentObject.transform.position.z);
  124. segment.SetActive(true);
  125. segmentToDelete.Enqueue(segment);
  126. segmentDoneCounter++;
  127. SpawnObstacles(segment);
  128. lastSegmentObject = segment;
  129. //questo foreach serve per salvarci il segmento di tipo SEGMENTO appena spawnato in modo da salvarlo e usare la sua posizione per capire dove potrà spawnare il successivo
  130. foreach (Segmento futureSegment in segmenti)
  131. {
  132. if (futureSegment.actualSegment == nextSegment)
  133. {
  134. lastSegment = futureSegment;
  135. }
  136. }
  137. }
  138. }
  139. }
  140.  
  141. private void SpawnObstacles(GameObject segment)
  142. {
  143. SpawnSmallObstacles(segment);
  144. bool obstacleAdded = false;
  145. int numOfCycles = 0;
  146. List<Vector3> obstaclePlaced = new List<Vector3>();
  147. int numberOfObstacles = Random.Range(lastSegment.minObstacles, lastSegment.maxObstacles + 1);
  148. //questo serve per far spawnare tutti gli obstacles scelti con un numero random
  149. for (int i = 0; i < numberOfObstacles; i++)
  150. {
  151. int indexOfObstacle = Random.Range(0, lastSegment.possibleObstacles.Count);
  152. GameObject obstacleObject = ObstacleObjectPooling.current.GetPooledObject(lastSegment.possibleObstacles[indexOfObstacle]);
  153. //posiziono l'ostacolo in maniera randomica in un punto in cui non è già stato posizionato.
  154. while (!obstacleAdded && numOfCycles < 10)
  155. {
  156. int indexOfObstaclePosition = Random.Range(0, segment.transform.Find("Obstacle Spawn").childCount);
  157. GameObject obstaclePosChosen = segment.transform.Find("Obstacle Spawn").GetChild(indexOfObstaclePosition).gameObject;
  158. if (!obstaclePlaced.Contains(obstaclePosChosen.transform.position))
  159. {
  160. obstacleObject.transform.position = obstaclePosChosen.transform.position;
  161. obstacleObject.SetActive(true);
  162. obstaclePlaced.Add(obstaclePosChosen.transform.position);
  163. obstacleAdded = true;
  164. }
  165. numOfCycles++;
  166. }
  167. //se dopo 10 tentativi non sono riuscito a posizionare l'ostacolo, non lo posiziono
  168. if(!obstacleAdded && numOfCycles >= 10)
  169. {
  170. obstacleObject.SetActive(false);
  171. }
  172. else
  173. {
  174. obstacleAdded = false;
  175. }
  176. }
  177. }
  178.  
  179. private void SpawnSmallObstacles(GameObject segment)
  180. {
  181. bool obstacleAdded = false;
  182. int numOfCycles = 0;
  183. List<Vector3> obstaclePlaced = new List<Vector3>();
  184. int numberOfObstacles = Random.Range(lastSegment.minSmallObstacles, lastSegment.maxSmallObstacles + 1);
  185. //questo serve per far spawnare tutti gli obstacles scelti con un numero random
  186. for (int i = 0; i < numberOfObstacles; i++)
  187. {
  188. int indexOfObstacle = Random.Range(0, lastSegment.possibleObstacles.Count);
  189. GameObject obstacleObject = SmallObstacleObjectPooling.current.GetPooledObject(lastSegment.possibleObstacles[indexOfObstacle]);
  190. //posiziono l'ostacolo in maniera randomica in un punto in cui non è già stato posizionato.
  191. while (!obstacleAdded && numOfCycles < 10)
  192. {
  193. int indexOfObstaclePosition = Random.Range(0, segment.transform.Find("Obstacle Small Spawn").childCount);
  194. GameObject obstaclePosChosen = segment.transform.Find("Obstacle Small Spawn").GetChild(indexOfObstaclePosition).gameObject;
  195. if (!obstaclePlaced.Contains(obstaclePosChosen.transform.position))
  196. {
  197. obstacleObject.transform.position = obstaclePosChosen.transform.position;
  198. obstacleObject.SetActive(true);
  199. obstaclePlaced.Add(obstaclePosChosen.transform.position);
  200. obstacleAdded = true;
  201. }
  202. numOfCycles++;
  203. }
  204. //se dopo 10 tentativi non sono riuscito a posizionare l'ostacolo, non lo posiziono
  205. if (!obstacleAdded && numOfCycles >= 10)
  206. {
  207. obstacleObject.SetActive(false);
  208. }
  209. else
  210. {
  211. obstacleAdded = false;
  212. }
  213. }
  214. }
  215.  
  216. public void FakeRestart()
  217. {
  218. ResetPhysics();
  219. SceneManager.LoadScene(0);
  220. Time.timeScale = 1.0F;
  221. }
  222.  
  223. private void ResetPhysics()
  224. {
  225. playerObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
  226. playerObject.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
  227. }
  228.  
  229. public void Pause()
  230. {
  231. if (Time.timeScale == 1.0F)
  232. {
  233. pausePanel.SetActive(true);
  234. Time.timeScale = 0F;
  235. }
  236. else
  237. {
  238. Time.timeScale = 1.0F;
  239. pausePanel.SetActive(false);
  240. }
  241. }
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement