initial commit
This commit is contained in:
143
Assets/Scripts/UranusAtmosphereSystem.cs
Normal file
143
Assets/Scripts/UranusAtmosphereSystem.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
using UnityEngine;
|
||||
|
||||
[ExecuteAlways]
|
||||
public class UranusAtmosphereSystem : MonoBehaviour
|
||||
{
|
||||
public float uranusRadiusUnits = 7.1492f;
|
||||
public float heightMultiplier = 8f;
|
||||
|
||||
[Header("Òåêñòóðè")]
|
||||
public Texture2D uranusTexture1;
|
||||
public Texture2D uranusTexture2;
|
||||
|
||||
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.3f, 0.85f, 0.9f),
|
||||
new Color(0.1f, 0.55f, 0.65f),
|
||||
2.5f, 0.7f, 0.008f, -0.005f);
|
||||
|
||||
CreateSimpleLayer("Layer_Stratosphere", 600f,
|
||||
new Color(0.85f, 0.75f, 0.3f),
|
||||
new Color(0.6f, 0.5f, 0.15f),
|
||||
1.2f, 0.35f);
|
||||
|
||||
CreateSimpleLayer("Layer_Thermosphere", 900f,
|
||||
new Color(0.5f, 0.3f, 1f),
|
||||
new Color(0.25f, 0.1f, 0.7f),
|
||||
0.9f, 0.2f);
|
||||
}
|
||||
|
||||
void CreateTextureLayer(string layerName, float heightKm,
|
||||
Color rimColor, Color coreColor,
|
||||
float rimIntensity, float coreIntensity,
|
||||
float scrollSpeed1, float scrollSpeed2)
|
||||
{
|
||||
float radiusUnits = uranusRadiusUnits + (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/JupiterAtmosphereLayer"));
|
||||
mat.SetColor("_RimColor", rimColor);
|
||||
mat.SetColor("_CoreColor", coreColor);
|
||||
mat.SetFloat("_RimPower", 2.0f);
|
||||
mat.SetFloat("_RimIntensity", rimIntensity);
|
||||
mat.SetFloat("_CoreIntensity", coreIntensity);
|
||||
mat.SetFloat("_ScrollSpeed1", scrollSpeed1);
|
||||
mat.SetFloat("_ScrollSpeed2", scrollSpeed2);
|
||||
mat.SetFloat("_PulseSpeed", 0.2f);
|
||||
mat.SetFloat("_PulseStrength", 0.08f);
|
||||
mat.SetFloat("_TextureBlend", 0.4f);
|
||||
mat.SetFloat("_TextureInfluence", 0.4f);
|
||||
|
||||
if (uranusTexture1 != null) mat.SetTexture("_MainTex", uranusTexture1);
|
||||
if (uranusTexture2 != null) mat.SetTexture("_SecondTex", uranusTexture2);
|
||||
|
||||
obj.GetComponent<Renderer>().material = mat;
|
||||
}
|
||||
|
||||
void CreateSimpleLayer(string layerName, float heightKm,
|
||||
Color rimColor, Color coreColor,
|
||||
float rimIntensity, float coreIntensity)
|
||||
{
|
||||
float radiusUnits = uranusRadiusUnits + (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.2f);
|
||||
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 = 2.5f; coreBase = 0.7f; break;
|
||||
case "Layer_Stratosphere": rimBase = 1.2f; coreBase = 0.35f; break;
|
||||
case "Layer_Thermosphere": rimBase = 0.9f; coreBase = 0.2f; 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user