Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.SceneManagement;
- using UnityEngine.UI;
- [System.Serializable]
- public class Segmento{
- public string nameElement;
- public GameObject actualSegment;
- public int minObstacles;
- public int minSmallObstacles;
- public int maxObstacles;
- public int maxSmallObstacles;
- public List<GameObject> possibleObstacles;
- public List<GameObject> possibleSmallObstacles;
- public List<GameObject> possibleFutureSegments;
- }
- public class LevelManager : MonoBehaviour {
- public static LevelManager current;
- public GameObject pausePanel;
- public Text scoreText, moneyText, scoreTextPause;
- public GameObject playerObject, firstSegment;
- public int changeBGCounter = 10; //cambiare changeBGCounter in base a quanti segmenti bisogna superare prima di cambiare BG.
- public List<Segmento> segmenti;
- [HideInInspector]
- public int currentMoney = 0;
- [HideInInspector]
- public int currentScore = 0;
- [HideInInspector]
- public Segmento lastSegment;
- [HideInInspector]
- public Queue<GameObject> segmentToDelete;
- 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.
- private GameObject lastSegmentObject;
- private int segmentDoneCounter = 0;
- private void Awake()
- {
- if (current == null)
- {
- current = this;
- }
- }
- private void Start()
- {
- scoreText.text = "" + 0;
- scoreTextPause.text = "" + 0; // score menù pausa
- moneyText.text = "MONEY: " + 0 + "$";
- segmentToDelete = new Queue<GameObject>();
- #region first spawn
- segmentToDelete.Enqueue(firstSegment);
- lastSegment.actualSegment = firstSegment;
- possibleSegmentsAfterLast = segmenti[0].possibleFutureSegments;
- int indexSegment = Random.Range(0, (possibleSegmentsAfterLast.Count));
- //primo foreach serve per far spawnare il successivo GAMEOBJECT segmento (in questo caso il primo).
- foreach (GameObject nextSegment in possibleSegmentsAfterLast)
- {
- if (nextSegment == possibleSegmentsAfterLast[indexSegment])
- {
- GameObject segment = ObjectPooling.current.GetPooledObject(nextSegment);
- segmentToDelete.Enqueue(segment);
- segment.transform.position = new Vector3(0f,7f,0f); //[on] Vas se cambi qualcosa nella posizione dei segmenti devo cambiare questo.
- segment.SetActive(true);
- segmentDoneCounter++;
- //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
- foreach (Segmento futureSegment in segmenti)
- {
- if (futureSegment.actualSegment == nextSegment)
- {
- lastSegmentObject = segment;
- lastSegment = futureSegment;
- SpawnObstacles(segment);
- }
- }
- }
- }
- #endregion
- }
- //spawn con il pooling
- public void SpawnSegments() {
- possibleSegmentsAfterLast = lastSegment.possibleFutureSegments;
- int indexSegment = Random.Range(0, (possibleSegmentsAfterLast.Count));
- //primo foreach serve per far spawnare il successivo GAMEOBJECT segmento
- foreach (GameObject nextSegment in possibleSegmentsAfterLast) {
- if(segmentDoneCounter == changeBGCounter) //cambio stage facendo spawnare l'ultimo segmento
- {
- if (nextSegment.name.Contains("end") && nextSegment.tag == lastSegmentObject.tag) {
- GameObject segment = ObjectPooling.current.GetPooledObject(nextSegment);
- int boundX = (int)lastSegmentObject.GetComponent<MeshCollider>().bounds.size.x;
- segment.transform.position = new Vector3(lastSegmentObject.transform.position.x + boundX, lastSegmentObject.transform.position.y, lastSegmentObject.transform.position.z);
- segment.SetActive(true);
- SpawnObstacles(segment);
- lastSegmentObject = segment;
- //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
- foreach (Segmento futureSegment in segmenti)
- {
- if (futureSegment.actualSegment == nextSegment)
- {
- lastSegment = futureSegment;
- }
- }
- segmentDoneCounter = 0;
- }
- }
- else if (nextSegment == possibleSegmentsAfterLast[indexSegment])
- {
- GameObject segment = ObjectPooling.current.GetPooledObject(nextSegment);
- int boundX = (int)lastSegmentObject.GetComponent<MeshCollider>().bounds.size.x;
- segment.transform.position = new Vector3(lastSegmentObject.transform.position.x + boundX, lastSegmentObject.transform.position.y, lastSegmentObject.transform.position.z);
- segment.SetActive(true);
- segmentToDelete.Enqueue(segment);
- segmentDoneCounter++;
- SpawnObstacles(segment);
- lastSegmentObject = segment;
- //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
- foreach (Segmento futureSegment in segmenti)
- {
- if (futureSegment.actualSegment == nextSegment)
- {
- lastSegment = futureSegment;
- }
- }
- }
- }
- }
- private void SpawnObstacles(GameObject segment)
- {
- SpawnSmallObstacles(segment);
- bool obstacleAdded = false;
- int numOfCycles = 0;
- List<Vector3> obstaclePlaced = new List<Vector3>();
- int numberOfObstacles = Random.Range(lastSegment.minObstacles, lastSegment.maxObstacles + 1);
- //questo serve per far spawnare tutti gli obstacles scelti con un numero random
- for (int i = 0; i < numberOfObstacles; i++)
- {
- int indexOfObstacle = Random.Range(0, lastSegment.possibleObstacles.Count);
- GameObject obstacleObject = ObstacleObjectPooling.current.GetPooledObject(lastSegment.possibleObstacles[indexOfObstacle]);
- //posiziono l'ostacolo in maniera randomica in un punto in cui non è già stato posizionato.
- while (!obstacleAdded && numOfCycles < 10)
- {
- int indexOfObstaclePosition = Random.Range(0, segment.transform.Find("Obstacle Spawn").childCount);
- GameObject obstaclePosChosen = segment.transform.Find("Obstacle Spawn").GetChild(indexOfObstaclePosition).gameObject;
- if (!obstaclePlaced.Contains(obstaclePosChosen.transform.position))
- {
- obstacleObject.transform.position = obstaclePosChosen.transform.position;
- obstacleObject.SetActive(true);
- obstaclePlaced.Add(obstaclePosChosen.transform.position);
- obstacleAdded = true;
- }
- numOfCycles++;
- }
- //se dopo 10 tentativi non sono riuscito a posizionare l'ostacolo, non lo posiziono
- if(!obstacleAdded && numOfCycles >= 10)
- {
- obstacleObject.SetActive(false);
- }
- else
- {
- obstacleAdded = false;
- }
- }
- }
- private void SpawnSmallObstacles(GameObject segment)
- {
- bool obstacleAdded = false;
- int numOfCycles = 0;
- List<Vector3> obstaclePlaced = new List<Vector3>();
- int numberOfObstacles = Random.Range(lastSegment.minSmallObstacles, lastSegment.maxSmallObstacles + 1);
- //questo serve per far spawnare tutti gli obstacles scelti con un numero random
- for (int i = 0; i < numberOfObstacles; i++)
- {
- int indexOfObstacle = Random.Range(0, lastSegment.possibleObstacles.Count);
- GameObject obstacleObject = SmallObstacleObjectPooling.current.GetPooledObject(lastSegment.possibleObstacles[indexOfObstacle]);
- //posiziono l'ostacolo in maniera randomica in un punto in cui non è già stato posizionato.
- while (!obstacleAdded && numOfCycles < 10)
- {
- int indexOfObstaclePosition = Random.Range(0, segment.transform.Find("Obstacle Small Spawn").childCount);
- GameObject obstaclePosChosen = segment.transform.Find("Obstacle Small Spawn").GetChild(indexOfObstaclePosition).gameObject;
- if (!obstaclePlaced.Contains(obstaclePosChosen.transform.position))
- {
- obstacleObject.transform.position = obstaclePosChosen.transform.position;
- obstacleObject.SetActive(true);
- obstaclePlaced.Add(obstaclePosChosen.transform.position);
- obstacleAdded = true;
- }
- numOfCycles++;
- }
- //se dopo 10 tentativi non sono riuscito a posizionare l'ostacolo, non lo posiziono
- if (!obstacleAdded && numOfCycles >= 10)
- {
- obstacleObject.SetActive(false);
- }
- else
- {
- obstacleAdded = false;
- }
- }
- }
- public void FakeRestart()
- {
- ResetPhysics();
- SceneManager.LoadScene(0);
- Time.timeScale = 1.0F;
- }
- private void ResetPhysics()
- {
- playerObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
- playerObject.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
- }
- public void Pause()
- {
- if (Time.timeScale == 1.0F)
- {
- pausePanel.SetActive(true);
- Time.timeScale = 0F;
- }
- else
- {
- Time.timeScale = 1.0F;
- pausePanel.SetActive(false);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement