initial commit
This commit is contained in:
140
Assets/Scripts/ExosphereEffects.cs
Normal file
140
Assets/Scripts/ExosphereEffects.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
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<ParticleSystem>();
|
||||
|
||||
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<ParticleSystemRenderer>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user