Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// SpaceSceneManager
- ///
- /// Questa classe è responsabile dell'inizializzazione e della gestione dei componenti principali della scena del gioco spaziale.
- /// Gestisce le seguenti attività chiave:
- /// 1. Creazione di un'istanza dei prefab di SCK (Space Combat Kit) essenziali (menu, telecamera, oggetti della scena).
- /// 2. Configurazione del giocatore, inclusa la creazione di un'istanza del sistema di input del giocatore e della nave del giocatore.
- /// 3. Configurare la telecamera per seguire la nave del giocatore.
- /// 4. Inizializzazione del SolarSystemManager con il veicolo del giocatore e la posizione di partenza.
- ///
- /// Il processo di inizializzazione viene gestito tramite una serie di coroutine per garantire la sequenza corretta
- /// e per consentire eventuali operazioni asincrone necessarie.
- ///
- /// Utilizzo:
- /// - Allega questo script a un GameObject nella scena di caricamento.
- /// - Assegna tutti i prefab richiesti e il SolarSystemManager nell'Inspector di Unity.
- /// - Imposta la posizione iniziale nell'Inspector di Unity o tramite il codice prima del caricamento della scena.
- ///
- /// Nota: questo gestore presuppone l'uso dello Space Combat Kit e del SolarSystemManager.
- /// Potrebbero essere necessarie modifiche se i sistemi sottostanti dovessero essere cambiati.
- /// </summary>
- using System.Collections;
- using UnityEngine;
- using VSX.FloatingOriginSystem;
- using VSX.UniversalVehicleCombat;
- namespace BrokenWings.SpaceSystem
- {
- public class SpaceSceneManager : MonoBehaviour
- {
- [Header("SCK Prefabs")]
- [SerializeField] private GameObject menuPrefab;
- [SerializeField] private GameObject cameraPrefab;
- [SerializeField] private GameObject sceneObjectsPrefab;
- [SerializeField] private GameObject playerInputSystemPrefab; // Player_InputSystem_SCK prefab
- [SerializeField] private GameObject playerShipPrefab;
- [Header("Solar System")]
- [SerializeField] private SolarSystemManager solarSystemManager;
- [SerializeField] private string startingLocationName = "Earth"; // Default starting location
- private GameAgentManager gameAgentManager;
- private GameAgent playerAgent;
- private Vehicle playerVehicle;
- private VehicleCamera vehicleCamera;
- private GameObject cameraObj; // instance of the CameraPrefab (used to be assigned to the FloatingManager)
- private GameObject sceneObjects; // instance of the SceneObjects prefab needed for the FloatingManager... stuff.
- private void Start()
- {
- StartCoroutine(InitializeGame());
- }
- private IEnumerator InitializeGame()
- {
- yield return StartCoroutine(InitializeSCKComponents());
- yield return StartCoroutine(SetupFloatingOrigin());
- yield return StartCoroutine(SetupPlayer());
- yield return StartCoroutine(SetupCamera());
- yield return StartCoroutine(InitializeSolarSystem());
- }
- private IEnumerator InitializeSCKComponents()
- {
- Instantiate(menuPrefab);
- cameraObj = Instantiate(cameraPrefab);
- sceneObjects = Instantiate(sceneObjectsPrefab);
- yield return null;
- gameAgentManager = sceneObjects.GetComponentInChildren<GameAgentManager>();
- if (gameAgentManager == null)
- {
- Debug.LogError("GameAgentManager not found in scene objects!");
- yield break;
- }
- vehicleCamera = cameraObj.GetComponentInChildren<VehicleCamera>();
- if (vehicleCamera == null)
- {
- Debug.LogError("VehicleCamera not found in camera prefab!");
- yield break;
- }
- }
- private IEnumerator SetupFloatingOrigin()
- {
- FloatingOriginManager floatingOriginManager = sceneObjects.GetComponentInChildren<FloatingOriginManager>();
- if (floatingOriginManager != null && cameraObj != null)
- {
- floatingOriginManager.FocusedTransform = cameraObj.transform;
- Debug.Log("Floating Origin Manager set up with camera prefab.");
- }
- else
- {
- Debug.LogError("Failed to setup Floating Origin: FloatingOriginManager or cameraPrefab is null.");
- }
- yield return null;
- }
- private IEnumerator SetupPlayer()
- {
- // Instantiate the player input system (agent)
- GameObject playerInputSystemObj = Instantiate(playerInputSystemPrefab);
- playerAgent = playerInputSystemObj.GetComponent<GameAgent>();
- if (playerAgent == null)
- {
- Debug.LogError("GameAgent component not found on player input system prefab!");
- yield break;
- }
- // Instantiate the player ship
- GameObject playerShipObj = Instantiate(playerShipPrefab);
- playerShipObj.SetActive(false); // Keep it inactive initially
- playerVehicle = playerShipObj.GetComponent<Vehicle>();
- if (playerVehicle == null)
- {
- Debug.LogError("Vehicle component not found on player ship prefab!");
- yield break;
- }
- yield return null;
- // Register the player agent
- gameAgentManager.Register(playerAgent, true);
- // Assign the ship to the player agent
- playerAgent.EnterVehicle(playerVehicle);
- // Now activate the player ship
- playerShipObj.SetActive(true);
- Debug.Log("Player setup completed successfully.");
- }
- private IEnumerator SetupCamera()
- {
- if (vehicleCamera != null && playerVehicle != null)
- {
- vehicleCamera.SetVehicle(playerVehicle);
- Debug.Log("Camera set to follow player vehicle.");
- }
- else
- {
- Debug.LogError("Failed to setup camera: VehicleCamera or playerVehicle is null.");
- }
- yield return null;
- }
- private IEnumerator InitializeSolarSystem()
- {
- if (solarSystemManager != null)
- {
- solarSystemManager.SetPlayerVehicle(playerVehicle);
- solarSystemManager.enabled = true;
- // Set the starting location
- Vector3 startPosition = solarSystemManager.GetCelestialObjectPosition(startingLocationName);
- playerVehicle.transform.position = startPosition;
- yield return null;
- Debug.Log($"Solar System initialized successfully. Starting at {startingLocationName}");
- }
- else
- {
- Debug.LogError("SolarSystemManager not assigned!");
- }
- }
- // Public method to set the starting location before the scene loads
- public void SetStartingLocation(string locationName)
- {
- startingLocationName = locationName;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment