using System.Collections; using System.Collections.Generic; using UnityEngine; public class ExosphereEffects : MonoBehaviour { [Header("Супутники")] public ThermosphereEffects thermosphereEffects; [Header("Витікання атмосфери")] public Material leakMaterial; public float leakRadius = 55f; [Range(0f, 1f)] public float exosphereLevel = 1f; private ParticleSystem leakSystem; void Start() { CreateLeakEffect(); } void CreateLeakEffect() { GameObject obj = new GameObject("AtmosphericLeak"); obj.transform.parent = this.transform; obj.transform.localPosition = Vector3.zero; obj.transform.localScale = Vector3.one; leakSystem = obj.AddComponent(); var main = leakSystem.main; main.loop = true; main.playOnAwake = false; main.maxParticles = 50000; main.startLifetime = new ParticleSystem.MinMaxCurve(8f, 15f); main.startSpeed = new ParticleSystem.MinMaxCurve(10f, 30f); main.startSize = new ParticleSystem.MinMaxCurve(1.2f, 1.8f); main.gravityModifier = -0.3f; main.startColor = new ParticleSystem.MinMaxGradient( new Color(0.2f, 0.5f, 1.0f, 1f), new Color(0.4f, 0.8f, 1.0f, 0.9f) ); main.simulationSpace = ParticleSystemSimulationSpace.World; var emission = leakSystem.emission; emission.rateOverTime = 0f; var shape = leakSystem.shape; shape.enabled = true; shape.shapeType = ParticleSystemShapeType.Sphere; shape.radius = leakRadius * 0.5f; shape.radiusThickness = 0f; var colorOverLifetime = leakSystem.colorOverLifetime; colorOverLifetime.enabled = true; Gradient gradient = new Gradient(); gradient.SetKeys( new GradientColorKey[] { new GradientColorKey(new Color(0.2f, 0.5f, 1.0f), 0f), new GradientColorKey(new Color(0.4f, 0.8f, 1.0f), 0.5f), new GradientColorKey(new Color(0.1f, 0.1f, 0.4f), 1f) }, new GradientAlphaKey[] { new GradientAlphaKey(1f, 0f), new GradientAlphaKey(0.6f, 0.7f), new GradientAlphaKey(0f, 1f) } ); colorOverLifetime.color = new ParticleSystem.MinMaxGradient(gradient); var sizeOverLifetime = leakSystem.sizeOverLifetime; sizeOverLifetime.enabled = true; AnimationCurve sizeCurve = new AnimationCurve(); sizeCurve.AddKey(0f, 0f); sizeCurve.AddKey(0.1f, 1f); sizeCurve.AddKey(0.8f, 0.8f); sizeCurve.AddKey(1f, 0f); sizeOverLifetime.size = new ParticleSystem.MinMaxCurve(1f, sizeCurve); var psRenderer = leakSystem.GetComponent(); psRenderer.renderMode = ParticleSystemRenderMode.Billboard; psRenderer.sortingFudge = 5f; if (leakMaterial != null) psRenderer.material = leakMaterial; } void UpdateLeak() { if (leakSystem == null) return; var emission = leakSystem.emission; if (exosphereLevel <= 0f) { emission.rateOverTime = 0f; leakSystem.gameObject.SetActive(false); return; } leakSystem.gameObject.SetActive(true); if (exosphereLevel <= 0.7f) { float t = Mathf.InverseLerp(0.7f, 0f, exosphereLevel); emission.rateOverTime = Mathf.Lerp(100f, 2000f, t); if (!leakSystem.isPlaying) leakSystem.Play(); } else { emission.rateOverTime = 0f; } } void Update() { if (!Application.isPlaying) return; UpdateGPS(); UpdateLeak(); } void Awake() { enabled = false; } void UpdateGPS() { if (thermosphereEffects == null) return; if (exosphereLevel < 0.3f) thermosphereEffects.DropAllSatellites(); } public void SetExosphereLevel(float level) { exosphereLevel = level; } }