Files
ScienceLab.AtmosphericPressure/Assets/Scripts/SaturnAtmosphereSystem.cs
2026-05-29 18:21:53 +03:00

157 lines
5.8 KiB
C#

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<Collider>());
else DestroyImmediate(obj.GetComponent<Collider>());
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<Renderer>().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<Collider>());
else DestroyImmediate(obj.GetComponent<Collider>());
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<Renderer>().material = mat;
}
public void SetLayerIntensity(string layerName, float level)
{
Transform layer = transform.Find(layerName);
if (layer == null) return;
Renderer r = layer.GetComponent<Renderer>();
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);
}
}