using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using System.Collections.Generic; using System.IO; using System; using System.Runtime.Serialization.Formatters.Binary; public class gameManager : MonoBehaviour { [Header ("Main Settings")] [Space] public bool limitFps; public bool updateLimitFpsIfChangeDetected; public int targetFps = 60; [Space] [Header ("Chapter Info")] [Space] public string chapterInfo; [Space] [Header ("Save Info")] [Space] public bool loadEnabled; public bool useRelativePath; [Space] [Header ("Load Screen Settings")] [Space] public bool useLoadScreen; public int loadScreenScene = 1; public bool useLastSceneIndexAsLoadScreen = true; public string sceneToLoadAsyncPrefsName = "SceneToLoadAsync"; [Space] [Header ("Version Number Settings")] [Space] public string versionNumber = "3-01"; [Space] [Header ("Save File Names Settings")] [Space] public string saveGameFolderName = "Save"; public string saveFileName = "Save State"; public string saveCaptureFolder = "Captures"; public string saveCaptureFileName = "Photo"; public string touchControlsPositionFolderName = "Touch Buttons Position"; public string touchControlsPositionFileName = "Touch Positions"; public string saveInputFileFolderName = "Input"; public string saveInputFileName = "Input File"; public string defaultInputSaveFileName = "Default Input File"; public string fileExtension = ".txt"; public int slotBySaveStation; public bool saveCameraCapture = true; public LayerMask layer; [Space] [Header ("Debug Settings")] [Space] public int saveNumberToLoad = -1; public string currentPersistentDataPath; public string currentSaveDataPath; public float playTime; [Space] [Header ("Current Game State")] [Space] public bool gamePaused; public bool useTouchControls = false; public bool touchPlatform; [Space] [Header ("Game Manager Elements")] [Space] public playerCharactersManager charactersManager; public Camera mainCamera; public GameObject mainPlayerGameObject; public GameObject mainPlayerCameraGameObject; public playerCamera currentPlayerCamera; List saveList = new List (); RaycastHit hit; int lastSaveNumber = -1; bool FPSLimitAdjusted; void Awake () { if (limitFps) { QualitySettings.vSyncCount = 0; Application.targetFrameRate = targetFps; } else { Application.targetFrameRate = -1; } touchPlatform = touchJoystick.checkTouchPlatform (); if (touchPlatform) { useRelativePath = false; } checkGameInfoToLoad (); } void checkGameInfoToLoad () { if (isLoadGameEnabled () && getLastSaveNumber () > -1) { string extraFileString = " " + getVersionNumber () + getFileExtension (); lastSaveNumber = -1; if (PlayerPrefs.HasKey ("saveNumber")) { lastSaveNumber = PlayerPrefs.GetInt ("saveNumber"); } else if (saveNumberToLoad >= 0) { lastSaveNumber = saveNumberToLoad; } currentSaveDataPath = getDataPath (); if (charactersManager != null) { charactersManager.checkGameInfoToLoad (lastSaveNumber, currentSaveDataPath, extraFileString); } } else { if (charactersManager != null) { charactersManager.checkComponentsToInitialize (); } } } public void saveGameInfoFromEditor (string infoTypeName) { if (isLoadGameEnabled () && saveNumberToLoad > -1) { string extraFileString = " " + getVersionNumber () + getFileExtension (); charactersManager.saveGameInfoFromEditor (saveNumberToLoad, infoTypeName, extraFileString); } } public void saveGameWhenReturningHomeMenu () { if (isLoadGameEnabled ()) { charactersManager.saveGameWhenReturningHomeMenu (); } } void Start () { currentPersistentDataPath = Application.persistentDataPath; if (loadEnabled && mainPlayerGameObject != null) { if (PlayerPrefs.HasKey ("chapterInfo")) { chapterInfo = PlayerPrefs.GetString ("chapterInfo"); } if (PlayerPrefs.HasKey ("loadingGame")) { if (PlayerPrefs.GetInt ("loadingGame") == 1) { Vector3 newPlayerPosition = Vector3.zero; Quaternion newPlayerRotation = Quaternion.identity; bool savingGameToChangeScene = false; if (PlayerPrefs.GetInt ("savingGameToChangeScene") == 1) { int levelManagerIDToLoad = PlayerPrefs.GetInt ("levelManagerIDToLoad"); bool targetFound = false; levelManagerIngame[] levelManagerIngameList = FindObjectsOfType (); foreach (levelManagerIngame currentLevelManagerIngame in levelManagerIngameList) { if (!targetFound && currentLevelManagerIngame.levelManagerID == levelManagerIDToLoad) { newPlayerPosition = currentLevelManagerIngame.spawPlayerPositionTransform.position; newPlayerRotation = currentLevelManagerIngame.spawPlayerPositionTransform.rotation; targetFound = true; savingGameToChangeScene = true; } } } else { newPlayerPosition = new Vector3 (PlayerPrefs.GetFloat ("saveStationPositionX"), PlayerPrefs.GetFloat ("saveStationPositionY"), PlayerPrefs.GetFloat ("saveStationPositionZ")); newPlayerRotation = Quaternion.Euler (PlayerPrefs.GetFloat ("saveStationRotationX"), PlayerPrefs.GetFloat ("saveStationRotationY"), PlayerPrefs.GetFloat ("saveStationRotationZ")); } if (PlayerPrefs.GetInt ("useRaycastToPlacePlayer") == 1) { if (Physics.Raycast (newPlayerPosition + Vector3.up, -Vector3.up, out hit, Mathf.Infinity, layer)) { newPlayerPosition = hit.point; } } bool isPlayerDriving = PlayerPrefs.GetInt ("isPlayerDriving") == 1; //set player position and rotation mainPlayerGameObject.transform.position = newPlayerPosition; mainPlayerGameObject.transform.rotation = newPlayerRotation; Quaternion newCameraRotation = newPlayerRotation; if (savingGameToChangeScene) { newCameraRotation = newPlayerRotation; } else { if (PlayerPrefs.GetInt ("usePlayerCameraOrientation") == 1) { newCameraRotation = Quaternion.Euler (PlayerPrefs.GetFloat ("playerCameraRotationX"), PlayerPrefs.GetFloat ("playerCameraRotationY"), PlayerPrefs.GetFloat ("playerCameraRotationZ")); float playerCameraPivotRotationX = PlayerPrefs.GetFloat ("playerCameraPivotRotationX"); float newLookAngle = playerCameraPivotRotationX; if (newLookAngle > 180) { newLookAngle -= 360; } Vector2 newPivotRotation = new Vector2 (0, newLookAngle); currentPlayerCamera.setLookAngleValue (newPivotRotation); currentPlayerCamera.getPivotCameraTransform ().localRotation = Quaternion.Euler (playerCameraPivotRotationX, 0, 0); } } mainPlayerCameraGameObject.transform.position = newPlayerPosition; mainPlayerCameraGameObject.transform.rotation = newCameraRotation; if (isPlayerDriving) { string vehicleName = PlayerPrefs.GetString ("currentVehicleName"); print ("PLAYER PREVIOUSLY DRIVING " + vehicleName); prefabsManager newPrefabsManager = FindObjectOfType (); if (newPrefabsManager == null) { newPrefabsManager = GKC_Utils.addPrefabsManagerToScene (); } if (newPrefabsManager != null) { GameObject vehiclePrefab = newPrefabsManager.getPrefabGameObject (vehicleName); if (vehiclePrefab != null) { mainPlayerGameObject.transform.position = newPlayerPosition + Vector3.right * 4; Vector3 vehiclePosition = Vector3.zero; if (Physics.Raycast (newPlayerPosition + Vector3.up * 20, -Vector3.up, out hit, Mathf.Infinity, layer)) { vehiclePosition = hit.point; } vehiclePosition += Vector3.up * newPrefabsManager.getPrefabSpawnOffset (vehicleName); Vector3 newPlayerRotationEulerAngles = newPlayerRotation.eulerAngles; newPlayerRotationEulerAngles = new Vector3 (0, newPlayerRotationEulerAngles.y, 0); newPlayerRotation = Quaternion.Euler (newPlayerRotationEulerAngles); GameObject newVehicle = (GameObject)Instantiate (vehiclePrefab, vehiclePosition, newPlayerRotation); newVehicle.name = vehiclePrefab.name; IKDrivingSystem currentIKDrivingSystem = newVehicle.GetComponent (); if (currentIKDrivingSystem != null) { currentIKDrivingSystem.setPlayerToStartGameOnThisVehicle (mainPlayerGameObject); } else { GKCSimpleRiderSystem mainGKCSimpleRiderSystem = newVehicle.GetComponentInChildren (); if (mainGKCSimpleRiderSystem == null) { GKCRiderSocketSystem currentGKCRiderSocketSystem = newVehicle.GetComponentInChildren (); if (currentGKCRiderSocketSystem != null) { mainRiderSystem currentmainRiderSystem = currentGKCRiderSocketSystem.getMainRiderSystem (); mainGKCSimpleRiderSystem = currentmainRiderSystem.GetComponent (); } } if (mainGKCSimpleRiderSystem != null) { mainGKCSimpleRiderSystem.setPlayerToStartGameOnThisVehicle (mainPlayerGameObject); } } elementOnSceneHelper vehicleElementOnSceneHelper = newVehicle.GetComponentInChildren (); if (vehicleElementOnSceneHelper != null) { vehicleElementOnSceneHelper.setNewInstantiatedElementOnSceneManagerIngameWithInfo (); int currentVehicleElementScene = PlayerPrefs.GetInt ("currentVehicleElementScene"); int currentVehicleElementID = PlayerPrefs.GetInt ("currentVehicleElementID"); vehicleElementOnSceneHelper.setStatsSearchingByInfo (currentVehicleElementScene, currentVehicleElementID); } } else { print ("WARNING: No prefab of the vehicle called " + vehicleName + " was found. Make sure a prefab with that name is configured in the prefabs manager"); } } } PlayerPrefs.DeleteAll (); } } if (PlayerPrefs.HasKey ("Delete Player Prefs Active")) { if (PlayerPrefs.GetInt ("Delete Player Prefs Active") == 1) { PlayerPrefs.DeleteAll (); } } } else { PlayerPrefs.DeleteAll (); } } void Update () { playTime += Time.unscaledDeltaTime; if (limitFps) { if (updateLimitFpsIfChangeDetected || !FPSLimitAdjusted) { if (Application.targetFrameRate != targetFps) { Application.targetFrameRate = targetFps; } if (!updateLimitFpsIfChangeDetected) { FPSLimitAdjusted = true; } } } } public void getPlayerPrefsInfo (saveGameSystem.saveStationInfo save) { PlayerPrefs.SetInt ("loadingGame", 1); PlayerPrefs.SetInt ("saveNumber", save.saveNumber); PlayerPrefs.SetInt ("currentSaveStationId", save.id); PlayerPrefs.SetFloat ("saveStationPositionX", save.saveStationPositionX); PlayerPrefs.SetFloat ("saveStationPositionY", save.saveStationPositionY); PlayerPrefs.SetFloat ("saveStationPositionZ", save.saveStationPositionZ); PlayerPrefs.SetFloat ("saveStationRotationX", save.saveStationRotationX); PlayerPrefs.SetFloat ("saveStationRotationY", save.saveStationRotationY); PlayerPrefs.SetFloat ("saveStationRotationZ", save.saveStationRotationZ); if (save.usePlayerCameraOrientation) { PlayerPrefs.SetInt ("usePlayerCameraOrientation", 1); } else { PlayerPrefs.SetInt ("usePlayerCameraOrientation", 0); } PlayerPrefs.SetFloat ("playerCameraRotationX", save.playerCameraRotationX); PlayerPrefs.SetFloat ("playerCameraRotationY", save.playerCameraRotationY); PlayerPrefs.SetFloat ("playerCameraRotationZ", save.playerCameraRotationZ); PlayerPrefs.SetFloat ("playerCameraPivotRotationX", save.playerCameraPivotRotationX); if (save.useRaycastToPlacePlayer) { PlayerPrefs.SetInt ("useRaycastToPlacePlayer", 1); } if (save.savingGameToChangeScene) { PlayerPrefs.SetInt ("savingGameToChangeScene", 1); } else { PlayerPrefs.SetInt ("savingGameToChangeScene", 0); } PlayerPrefs.SetInt ("levelManagerIDToLoad", save.checkpointID); if (save.isPlayerDriving) { PlayerPrefs.SetInt ("isPlayerDriving", 1); PlayerPrefs.SetString ("currentVehicleName", save.currentVehicleName); PlayerPrefs.SetInt ("currentVehicleElementScene", save.currentVehicleElementScene); PlayerPrefs.SetInt ("currentVehicleElementID", save.currentVehicleElementID); } else { PlayerPrefs.SetInt ("isPlayerDriving", 0); } print ("setting prefs to load " + save.saveStationScene + " " + loadScreenScene); GKC_Utils.loadScene (save.saveStationScene, useLoadScreen, loadScreenScene, sceneToLoadAsyncPrefsName, useLastSceneIndexAsLoadScreen); } public string getDataPath () { string dataPath = ""; if (useRelativePath) { dataPath = saveGameFolderName; } else { dataPath = Application.persistentDataPath + "/" + saveGameFolderName; } if (!Directory.Exists (dataPath)) { Directory.CreateDirectory (dataPath); } dataPath += "/"; return dataPath; } public string getDataName () { return saveFileName + " " + versionNumber; } public string getVersionNumber () { return versionNumber; } public string getFileExtension () { return fileExtension; } public List getCurrentSaveList () { return saveList; } public void setSaveList (List currentList) { saveList = currentList; } public int getLastSaveNumber () { lastSaveNumber = -1; if (PlayerPrefs.HasKey ("saveNumber")) { lastSaveNumber = PlayerPrefs.GetInt ("saveNumber"); print ("save number player prefs located " + lastSaveNumber); } else if (saveNumberToLoad >= 0) { lastSaveNumber = saveNumberToLoad; } return lastSaveNumber; } public void setGamePauseState (bool state) { gamePaused = state; } public bool isGamePaused () { return gamePaused; } public bool isUsingTouchControls () { return useTouchControls; } public void setUseTouchControlsState (bool state) { useTouchControls = state; } public void setCharactersManagerPauseState (bool state) { charactersManager.setCharactersManagerPauseState (state); } public playerController getMainPlayerController () { return charactersManager.getMainPlayerController (); } public bool anyCharacterDead () { return charactersManager.anyCharacterDead (); } public string getSaveCaptureFolder () { return saveCaptureFolder; } public string getSaveCaptureFileName () { return saveCaptureFileName; } public string getTouchControlsPositionFolderName () { return touchControlsPositionFolderName; } public string getTouchControlsPositionFileName () { return touchControlsPositionFileName + " " + versionNumber; } public bool isLoadGameEnabled () { return loadEnabled; } public void setNewChapterName (string newName) { chapterInfo = newName; } public string getChapterName () { return chapterInfo; } public float getPlayTime () { return playTime; } public void setPlayTimeValue (float newValue) { playTime = newValue; } //EDITOR FUNCTIONS public void setUseTouchControlsStateFromEditor (bool state) { useTouchControls = state; updateComponent (); } public void setCurrentPersistentDataPath () { currentPersistentDataPath = Application.persistentDataPath; updateComponent (); } public void deletePlayerPrefs () { PlayerPrefs.DeleteAll (); print ("Player Prefs Deleted"); } public void getCurrentDataPath () { setCurrentPersistentDataPath (); currentSaveDataPath = getDataPath (); updateComponent (); } public void updateComponent () { GKC_Utils.updateComponent (this); } }