/
arti4
/
Diplom
Обзор
Документация
Войти
/
arti4
/
Diplom
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Scripts/Buildings/Garage/CarSaveSystem.cs
379 строк
11 KB
arti4
Загрузка всех скриптов
17 май 2026, 09:08
Верифицирован
17 май 2026, 09:08
cc2e1cd
Код
Авторство
О чём код?
using VP; using System.Collections.Generic; using UnityEngine; public class CarSaveSystem : MonoBehaviour { private const string SELECTED_CAR_KEY = "SelectedCar"; private const string CAR_UPGRADES_PREFIX = "CarUpgrades_"; private const string CAR_COLOR_PREFIX = "CarColor_"; private const string CAR_PURCHASED_PREFIX = "CarPurchased_"; private const string UPGRADE_PURCHASED_PREFIX = "UpgradePurchased_"; [Header("Настройки")] public VehicleController[] carPrefabs; public Transform spawnPoint; public static CarSaveSystem Instance { get; private set; } private GameObject currentCar; void Start() { ApplyColorToCurrentCar(); } void ApplyColorToCurrentCar() { if (currentCar == null) return; int carIndex = LoadSelectedCar(); if (CarColorSystem.Instance != null) { CarColorSystem.Instance.ApplyColorToCar(currentCar, carIndex); } else { Color savedColor = LoadCarColor(carIndex); } } void Awake() { if (Instance == null) { Instance = this; if (transform.parent == null) { DontDestroyOnLoad(gameObject); } else { Debug.LogWarning("CarSaveSystem должен быть на корневом GameObject!"); transform.SetParent(null); DontDestroyOnLoad(gameObject); } } else { Destroy(gameObject); } } public void SpawnSavedCar() { if (carPrefabs == null || carPrefabs.Length == 0) { Debug.LogError("CarSaveSystem: Не назначены префабы машин!"); return; } if (currentCar != null) { Destroy(currentCar); } int savedIndex = LoadSelectedCar(); if (savedIndex < 0 || savedIndex >= carPrefabs.Length) { savedIndex = 0; SaveSelectedCar(savedIndex); } if (spawnPoint != null && carPrefabs[savedIndex] != null) { currentCar = Instantiate(carPrefabs[savedIndex].gameObject, spawnPoint.position, spawnPoint.rotation); currentCar.name = $"PlayerCar_{savedIndex}"; if (CarColorSystem.Instance != null) { CarColorSystem.Instance.ApplyColorToCar(currentCar, savedIndex); } if (CarUpgradeManager.Instance != null) { CarUpgradeManager.Instance.ReloadUpgrades(); CarUpgradeManager.Instance.LoadCarUpgradesForIndex(savedIndex); CarUpgradeManager.Instance.ApplyUpgradeToVehicle(currentCar, savedIndex); } else { Debug.LogWarning("CarUpgradeManager.Instance не найден!"); } } } void ApplyBasicUpgradesFromSave(VehicleController vehicle, int carIndex) { string carId = $"Car_{carIndex}"; if (CarSaveSystem.Instance.LoadCarAdvancedUpgrades(carId, out int maxSpeedLevel, out int driveSlipLevel, out int forceCurveLevel, out bool tcEnabled, out float tcRatio, out bool baEnabled, out float baRatio, out bool slEnabled, out float slRatio, out bool saEnabled, out float saRatio)) { vehicle.tractionControl = tcEnabled; vehicle.tractionControlRatio = tcRatio; vehicle.brakeAssist = baEnabled; vehicle.brakeAssistRatio = baRatio; vehicle.steeringLimit = slEnabled; vehicle.steeringLimitRatio = slRatio; vehicle.steeringAssist = saEnabled; vehicle.steeringAssistRatio = saRatio; } } public void SaveCarAdvancedUpgrades(string carId, int maxSpeedLevel, int driveSlipLevel, int forceCurveLevel, bool tcEnabled, float tcRatio, bool baEnabled, float baRatio, bool slEnabled, float slRatio, bool saEnabled, float saRatio) { string key = $"CarAdvanced_{carId}"; string data = $"{maxSpeedLevel},{driveSlipLevel},{forceCurveLevel}," + $"{(tcEnabled ? 1 : 0)},{tcRatio:F2}," + $"{(baEnabled ? 1 : 0)},{baRatio:F2}," + $"{(slEnabled ? 1 : 0)},{slRatio:F2}," + $"{(saEnabled ? 1 : 0)},{saRatio:F2}"; PlayerPrefs.SetString(key, data); PlayerPrefs.Save(); } public bool LoadCarAdvancedUpgrades(string carId, out int maxSpeedLevel, out int driveSlipLevel, out int forceCurveLevel, out bool tcEnabled, out float tcRatio, out bool baEnabled, out float baRatio, out bool slEnabled, out float slRatio, out bool saEnabled, out float saRatio) { string key = $"CarAdvanced_{carId}"; maxSpeedLevel = 0; driveSlipLevel = 0; forceCurveLevel = 0; tcEnabled = false; tcRatio = 0.5f; baEnabled = false; baRatio = 0.5f; slEnabled = false; slRatio = 0.5f; saEnabled = true; saRatio = 0.5f; if (PlayerPrefs.HasKey(key)) { string data = PlayerPrefs.GetString(key); string[] values = data.Split(','); if (values.Length >= 11) { maxSpeedLevel = int.Parse(values[0]); driveSlipLevel = int.Parse(values[1]); forceCurveLevel = int.Parse(values[2]); tcEnabled = values[3] == "1"; tcRatio = float.Parse(values[4]); baEnabled = values[5] == "1"; baRatio = float.Parse(values[6]); slEnabled = values[7] == "1"; slRatio = float.Parse(values[8]); saEnabled = values[9] == "1"; saRatio = float.Parse(values[10]); return true; } } return false; } public void SaveSelectedCar(int carIndex) { PlayerPrefs.SetInt(SELECTED_CAR_KEY, carIndex); PlayerPrefs.Save(); } public int LoadSelectedCar() { int savedIndex = PlayerPrefs.GetInt(SELECTED_CAR_KEY, 0); if (carPrefabs != null) { if (savedIndex < 0 || savedIndex >= carPrefabs.Length) { Debug.LogWarning($"CarSaveSystem: Неверный сохраненный индекс {savedIndex}, сбрасываю на 0"); savedIndex = 0; SaveSelectedCar(0); } } return savedIndex; } public void SaveCarUpgrades(string carId, int engineLevel, int brakeLevel, int handlingLevel) { string key = CAR_UPGRADES_PREFIX + carId; string data = $"{engineLevel},{brakeLevel},{handlingLevel}"; PlayerPrefs.SetString(key, data); PlayerPrefs.Save(); } public bool LoadCarUpgrades(string carId, out int engineLevel, out int brakeLevel, out int handlingLevel) { string key = CAR_UPGRADES_PREFIX + carId; if (PlayerPrefs.HasKey(key)) { string data = PlayerPrefs.GetString(key); string[] values = data.Split(','); if (values.Length >= 3) { engineLevel = int.Parse(values[0]); brakeLevel = int.Parse(values[1]); handlingLevel = int.Parse(values[2]); return true; } } engineLevel = 0; brakeLevel = 0; handlingLevel = 0; return false; } public void ResetAllData() { PlayerPrefs.DeleteAll(); PlayerPrefs.Save(); } public int GetCurrentCarIndex() { return LoadSelectedCar(); } public void SaveCarColor(int carIndex, Color color) { string key = CAR_COLOR_PREFIX + carIndex; string colorHex = ColorUtility.ToHtmlStringRGB(color); PlayerPrefs.SetString(key, colorHex); PlayerPrefs.Save(); } public Color LoadCarColor(int carIndex) { string key = CAR_COLOR_PREFIX + carIndex; if (PlayerPrefs.HasKey(key)) { string colorHex = PlayerPrefs.GetString(key); if (ColorUtility.TryParseHtmlString("#" + colorHex, out Color color)) { return color; } } return new Color(0.2f, 0.6f, 1f); } public bool HasSavedColor(int carIndex) { string key = CAR_COLOR_PREFIX + carIndex; return PlayerPrefs.HasKey(key); } public void SaveCarPurchased(int carIndex, bool isPurchased) { string key = CAR_PURCHASED_PREFIX + carIndex; PlayerPrefs.SetInt(key, isPurchased ? 1 : 0); PlayerPrefs.Save(); } public bool LoadCarPurchased(int carIndex) { string key = CAR_PURCHASED_PREFIX + carIndex; if (carIndex == 0) { return true; } bool isPurchased = PlayerPrefs.GetInt(key, 0) == 1; return isPurchased; } public void ResetAllPurchases() { for (int i = 1; i < 100; i++) { string key = CAR_PURCHASED_PREFIX + i; if (PlayerPrefs.HasKey(key)) { PlayerPrefs.DeleteKey(key); } } SaveCarPurchased(0, true); PlayerPrefs.Save(); } public bool IsCarPurchased(int carIndex) { return LoadCarPurchased(carIndex); } public void SaveUpgradePurchased(string carId, string upgradeType, int level, bool isPurchased) { string key = $"{UPGRADE_PURCHASED_PREFIX}{carId}_{upgradeType}_Level{level}"; PlayerPrefs.SetInt(key, isPurchased ? 1 : 0); PlayerPrefs.Save(); } public bool LoadUpgradePurchased(string carId, string upgradeType, int level) { string key = $"{UPGRADE_PURCHASED_PREFIX}{carId}_{upgradeType}_Level{level}"; if (level == 0) return true; return PlayerPrefs.GetInt(key, 0) == 1; } public void ResetAllUpgradePurchases(string carId) { string prefix = $"{UPGRADE_PURCHASED_PREFIX}{carId}_"; string[] upgradeTypes = { "Engine", "Brake", "TireFriction", "SteerAngle", "MaxSpeed", "DriveSlip", "ForceCurve" }; for (int level = 1; level <= 4; level++) { foreach (string upgradeType in upgradeTypes) { string key = $"{prefix}{upgradeType}_Level{level}"; if (PlayerPrefs.HasKey(key)) { PlayerPrefs.DeleteKey(key); } } } for (int drivetrainType = 1; drivetrainType <= 3; drivetrainType++) { string drivetrainKey = $"{carId}_Drivetrain_{drivetrainType}_Purchased"; if (PlayerPrefs.HasKey(drivetrainKey)) { PlayerPrefs.DeleteKey(drivetrainKey); } } PlayerPrefs.Save(); } }