using UnityEngine; [ExecuteAlways] public class SaturnAtmosphereSystem : MonoBehaviour { public float saturnRadiusUnits = 7.1492f; public float heightMultiplier = 8f; [Header("Текстури для тропосфери і стратосфери")] public Texture2D saturnTexture1; public Texture2D saturnTexture2; public Texture2D saturnFogTexture; void OnEnable() { if (!Application.isPlaying && transform.childCount == 0) BuildLayers(); } [ContextMenu("Перебудувати шари")] public void BuildLayers() { for (int i = transform.childCount - 1; i >= 0; i--) { Transform child = transform.GetChild(i); if (child.name.StartsWith("Layer_")) { if (Application.isPlaying) Destroy(child.gameObject); else DestroyImmediate(child.gameObject); } } CreateTextureLayer("Layer_Troposphere", 300f, new Color(0.85f, 0.75f, 0.45f), new Color(0.65f, 0.55f, 0.25f), new Color(0.95f, 0.9f, 0.75f), 1.5f, 0.3f, 0.01f, -0.007f, 0.003f); CreateTextureLayer("Layer_Stratosphere", 600f, new Color(0.9f, 0.82f, 0.55f), new Color(0.7f, 0.62f, 0.35f), new Color(0.95f, 0.92f, 0.8f), 1.0f, 0.2f, 0.008f, -0.005f, 0.004f); CreateSimpleLayer("Layer_Thermosphere", 900f, new Color(0.6f, 0.5f, 0.8f), new Color(0.4f, 0.3f, 0.6f), 0.5f, 0.12f); CreateSimpleLayer("Layer_Exosphere", 1200f, new Color(0.55f, 0.45f, 0.75f), new Color(0.35f, 0.25f, 0.55f), 0.3f, 0.06f); } void CreateTextureLayer(string layerName, float heightKm, Color rimColor, Color coreColor, Color fogColor, float rimIntensity, float coreIntensity, float scrollSpeed1, float scrollSpeed2, float fogScrollSpeed) { float radiusUnits = saturnRadiusUnits + (heightKm / 1000f) * heightMultiplier; GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.name = layerName; obj.transform.parent = this.transform; obj.transform.localPosition = Vector3.zero; obj.transform.localScale = Vector3.one * radiusUnits * 2f; if (Application.isPlaying) Destroy(obj.GetComponent()); else DestroyImmediate(obj.GetComponent()); Material mat = new Material(Shader.Find("Custom/SaturnAtmosphereLayer")); mat.SetColor("_RimColor", rimColor); mat.SetColor("_CoreColor", coreColor); mat.SetColor("_FogColor", fogColor); mat.SetFloat("_RimPower", 2.0f); mat.SetFloat("_RimIntensity", rimIntensity); mat.SetFloat("_CoreIntensity", coreIntensity); mat.SetFloat("_ScrollSpeed1", scrollSpeed1); mat.SetFloat("_ScrollSpeed2", scrollSpeed2); mat.SetFloat("_FogScrollSpeed", fogScrollSpeed); mat.SetFloat("_PulseSpeed", 0.4f); mat.SetFloat("_PulseStrength", 0.08f); mat.SetFloat("_TextureBlend", 0.5f); mat.SetFloat("_TextureInfluence", 0.5f); mat.SetFloat("_FogInfluence", 0.3f); if (saturnTexture1 != null) mat.SetTexture("_MainTex", saturnTexture1); if (saturnTexture2 != null) mat.SetTexture("_SecondTex", saturnTexture2); if (saturnFogTexture != null) mat.SetTexture("_FogTex", saturnFogTexture); obj.GetComponent().material = mat; } void CreateSimpleLayer(string layerName, float heightKm, Color rimColor, Color coreColor, float rimIntensity, float coreIntensity) { float radiusUnits = saturnRadiusUnits + (heightKm / 1000f) * heightMultiplier; GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.name = layerName; obj.transform.parent = this.transform; obj.transform.localPosition = Vector3.zero; obj.transform.localScale = Vector3.one * radiusUnits * 2f; if (Application.isPlaying) Destroy(obj.GetComponent()); else DestroyImmediate(obj.GetComponent()); Material mat = new Material(Shader.Find("Custom/AtmosphereLayer")); mat.SetColor("_RimColor", rimColor); mat.SetColor("_CoreColor", coreColor); mat.SetFloat("_RimPower", 2.0f); mat.SetFloat("_RimIntensity", rimIntensity); mat.SetFloat("_CoreIntensity", coreIntensity); mat.SetFloat("_PulseSpeed", 0.4f); mat.SetFloat("_PulseStrength", 0.08f); obj.GetComponent().material = mat; } public void SetLayerIntensity(string layerName, float level) { Transform layer = transform.Find(layerName); if (layer == null) return; Renderer r = layer.GetComponent(); if (r == null) return; float rimBase = 0f; float coreBase = 0f; switch (layerName) { case "Layer_Troposphere": rimBase = 1.5f; coreBase = 0.3f; break; case "Layer_Stratosphere": rimBase = 1.0f; coreBase = 0.2f; break; case "Layer_Thermosphere": rimBase = 0.5f; coreBase = 0.12f; break; case "Layer_Exosphere": rimBase = 0.3f; coreBase = 0.06f; break; } r.material.SetFloat("_RimIntensity", Mathf.Lerp(0f, rimBase, level)); r.material.SetFloat("_CoreIntensity", Mathf.Lerp(0f, coreBase, level)); } public void SetLayerActive(string layerName, bool active) { Transform layer = transform.Find(layerName); if (layer != null) layer.gameObject.SetActive(active); } public void SetIntensity(float level) { SetLayerIntensity("Layer_Troposphere", level); SetLayerIntensity("Layer_Stratosphere", level); SetLayerIntensity("Layer_Thermosphere", level); SetLayerIntensity("Layer_Exosphere", level); } }