MaximilianPs

SpaceSceneManager

Jul 9th, 2024 (edited)
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.12 KB | None | 0 0
  1. /// <summary>
  2. /// SpaceSceneManager
  3. ///
  4. /// Questa classe è responsabile dell'inizializzazione e della gestione dei componenti principali della scena del gioco spaziale.
  5. /// Gestisce le seguenti attività chiave:
  6. /// 1. Creazione di un'istanza dei prefab di SCK (Space Combat Kit) essenziali (menu, telecamera, oggetti della scena).
  7. /// 2. Configurazione del giocatore, inclusa la creazione di un'istanza del sistema di input del giocatore e della nave del giocatore.
  8. /// 3. Configurare la telecamera per seguire la nave del giocatore.
  9. /// 4. Inizializzazione del SolarSystemManager con il veicolo del giocatore e la posizione di partenza.
  10. ///
  11. /// Il processo di inizializzazione viene gestito tramite una serie di coroutine per garantire la sequenza corretta
  12. /// e per consentire eventuali operazioni asincrone necessarie.
  13. ///
  14. /// Utilizzo:
  15. /// - Allega questo script a un GameObject nella scena di caricamento.
  16. /// - Assegna tutti i prefab richiesti e il SolarSystemManager nell'Inspector di Unity.
  17. /// - Imposta la posizione iniziale nell'Inspector di Unity o tramite il codice prima del caricamento della scena.
  18. ///
  19. /// Nota: questo gestore presuppone l'uso dello Space Combat Kit e del SolarSystemManager.
  20. /// Potrebbero essere necessarie modifiche se i sistemi sottostanti dovessero essere cambiati.
  21. /// </summary>
  22.  
  23. using System.Collections;
  24. using UnityEngine;
  25. using VSX.FloatingOriginSystem;
  26. using VSX.UniversalVehicleCombat;
  27.  
  28. namespace BrokenWings.SpaceSystem
  29. {
  30.     public class SpaceSceneManager : MonoBehaviour
  31.     {
  32.         [Header("SCK Prefabs")]
  33.         [SerializeField] private GameObject menuPrefab;
  34.         [SerializeField] private GameObject cameraPrefab;
  35.         [SerializeField] private GameObject sceneObjectsPrefab;
  36.         [SerializeField] private GameObject playerInputSystemPrefab; // Player_InputSystem_SCK prefab
  37.         [SerializeField] private GameObject playerShipPrefab;
  38.  
  39.         [Header("Solar System")]
  40.         [SerializeField] private SolarSystemManager solarSystemManager;
  41.         [SerializeField] private string startingLocationName = "Earth";  // Default starting location
  42.  
  43.         private GameAgentManager gameAgentManager;
  44.         private GameAgent playerAgent;
  45.         private Vehicle playerVehicle;
  46.         private VehicleCamera vehicleCamera;
  47.  
  48.         private GameObject cameraObj; // instance of the CameraPrefab (used to be assigned to the FloatingManager)
  49.         private GameObject sceneObjects; // instance of the SceneObjects prefab needed for the FloatingManager... stuff.
  50.         private void Start()
  51.         {
  52.             StartCoroutine(InitializeGame());
  53.         }
  54.  
  55.         private IEnumerator InitializeGame()
  56.         {
  57.             yield return StartCoroutine(InitializeSCKComponents());
  58.             yield return StartCoroutine(SetupFloatingOrigin());
  59.             yield return StartCoroutine(SetupPlayer());
  60.             yield return StartCoroutine(SetupCamera());
  61.             yield return StartCoroutine(InitializeSolarSystem());
  62.         }
  63.  
  64.         private IEnumerator InitializeSCKComponents()
  65.         {
  66.             Instantiate(menuPrefab);
  67.             cameraObj = Instantiate(cameraPrefab);
  68.             sceneObjects = Instantiate(sceneObjectsPrefab);
  69.  
  70.             yield return null;
  71.  
  72.             gameAgentManager = sceneObjects.GetComponentInChildren<GameAgentManager>();
  73.             if (gameAgentManager == null)
  74.             {
  75.                 Debug.LogError("GameAgentManager not found in scene objects!");
  76.                 yield break;
  77.             }
  78.  
  79.             vehicleCamera = cameraObj.GetComponentInChildren<VehicleCamera>();
  80.             if (vehicleCamera == null)
  81.             {
  82.                 Debug.LogError("VehicleCamera not found in camera prefab!");
  83.                 yield break;
  84.             }
  85.         }
  86.  
  87.         private IEnumerator SetupFloatingOrigin()
  88.         {
  89.             FloatingOriginManager floatingOriginManager = sceneObjects.GetComponentInChildren<FloatingOriginManager>();
  90.             if (floatingOriginManager != null && cameraObj != null)
  91.             {
  92.                 floatingOriginManager.FocusedTransform = cameraObj.transform;
  93.                 Debug.Log("Floating Origin Manager set up with camera prefab.");
  94.             }
  95.             else
  96.             {
  97.                 Debug.LogError("Failed to setup Floating Origin: FloatingOriginManager or cameraPrefab is null.");
  98.             }
  99.             yield return null;
  100.         }
  101.  
  102.         private IEnumerator SetupPlayer()
  103.         {
  104.             // Instantiate the player input system (agent)
  105.             GameObject playerInputSystemObj = Instantiate(playerInputSystemPrefab);
  106.             playerAgent = playerInputSystemObj.GetComponent<GameAgent>();
  107.             if (playerAgent == null)
  108.             {
  109.                 Debug.LogError("GameAgent component not found on player input system prefab!");
  110.                 yield break;
  111.             }
  112.  
  113.             // Instantiate the player ship
  114.             GameObject playerShipObj = Instantiate(playerShipPrefab);
  115.             playerShipObj.SetActive(false);  // Keep it inactive initially
  116.             playerVehicle = playerShipObj.GetComponent<Vehicle>();
  117.             if (playerVehicle == null)
  118.             {
  119.                 Debug.LogError("Vehicle component not found on player ship prefab!");
  120.                 yield break;
  121.             }
  122.  
  123.             yield return null;
  124.  
  125.             // Register the player agent
  126.             gameAgentManager.Register(playerAgent, true);
  127.  
  128.             // Assign the ship to the player agent
  129.             playerAgent.EnterVehicle(playerVehicle);
  130.  
  131.             // Now activate the player ship
  132.             playerShipObj.SetActive(true);
  133.  
  134.             Debug.Log("Player setup completed successfully.");
  135.         }
  136.  
  137.         private IEnumerator SetupCamera()
  138.         {
  139.             if (vehicleCamera != null && playerVehicle != null)
  140.             {
  141.                 vehicleCamera.SetVehicle(playerVehicle);
  142.                 Debug.Log("Camera set to follow player vehicle.");
  143.             }
  144.             else
  145.             {
  146.                 Debug.LogError("Failed to setup camera: VehicleCamera or playerVehicle is null.");
  147.             }
  148.             yield return null;
  149.         }
  150.  
  151.         private IEnumerator InitializeSolarSystem()
  152.         {
  153.             if (solarSystemManager != null)
  154.             {
  155.                 solarSystemManager.SetPlayerVehicle(playerVehicle);
  156.                 solarSystemManager.enabled = true;
  157.  
  158.                 // Set the starting location
  159.                 Vector3 startPosition = solarSystemManager.GetCelestialObjectPosition(startingLocationName);
  160.                 playerVehicle.transform.position = startPosition;
  161.  
  162.                 yield return null;
  163.                 Debug.Log($"Solar System initialized successfully. Starting at {startingLocationName}");
  164.             }
  165.             else
  166.             {
  167.                 Debug.LogError("SolarSystemManager not assigned!");
  168.             }
  169.         }
  170.  
  171.         // Public method to set the starting location before the scene loads
  172.         public void SetStartingLocation(string locationName)
  173.         {
  174.             startingLocationName = locationName;
  175.         }
  176.     }
  177. }
Advertisement
Add Comment
Please, Sign In to add comment