initial commit
This commit is contained in:
211
Assets/Scripts/MarsExosphereEffects.cs
Normal file
211
Assets/Scripts/MarsExosphereEffects.cs
Normal file
@@ -0,0 +1,211 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class MarsExosphereEffects : MonoBehaviour
|
||||
{
|
||||
public Material ruptureMaterial;
|
||||
public Material escapeMaterial;
|
||||
|
||||
[Range(0f, 1f)]
|
||||
public float exosphereLevel = 1f;
|
||||
|
||||
private float previousLevel = 1f;
|
||||
|
||||
private ParticleSystem ruptureSystem;
|
||||
private ParticleSystem escapeSystem;
|
||||
|
||||
private bool deathTriggered = false;
|
||||
|
||||
private MarsDeath marsDeath;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
enabled = false;
|
||||
}
|
||||
|
||||
public void InitState()
|
||||
{
|
||||
if (ruptureSystem != null) Destroy(ruptureSystem.gameObject);
|
||||
if (escapeSystem != null) Destroy(escapeSystem.gameObject);
|
||||
|
||||
ruptureSystem = null;
|
||||
escapeSystem = null;
|
||||
|
||||
marsDeath = GetComponentInParent<MarsDeath>();
|
||||
|
||||
exosphereLevel = 1f;
|
||||
previousLevel = 1f;
|
||||
deathTriggered = false;
|
||||
|
||||
CreateSystems();
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (!Application.isPlaying) return;
|
||||
|
||||
if (exosphereLevel >= 1f && previousLevel < 1f)
|
||||
ResetState();
|
||||
|
||||
previousLevel = exosphereLevel;
|
||||
|
||||
if (exosphereLevel <= 0f && !deathTriggered)
|
||||
{
|
||||
deathTriggered = true;
|
||||
|
||||
if (marsDeath != null)
|
||||
marsDeath.mesosphereLevel = 0f;
|
||||
|
||||
StartCoroutine(DeathBurst());
|
||||
return;
|
||||
}
|
||||
|
||||
if (deathTriggered) return;
|
||||
|
||||
UpdateRupture();
|
||||
UpdateEscape();
|
||||
}
|
||||
|
||||
void ResetState()
|
||||
{
|
||||
deathTriggered = false;
|
||||
|
||||
if (marsDeath != null)
|
||||
marsDeath.ResetTexture();
|
||||
|
||||
if (ruptureSystem != null)
|
||||
{
|
||||
var e = ruptureSystem.emission;
|
||||
e.rateOverTime = 0;
|
||||
}
|
||||
|
||||
if (escapeSystem != null)
|
||||
{
|
||||
var e = escapeSystem.emission;
|
||||
e.rateOverTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void CreateSystems()
|
||||
{
|
||||
GameObject r = new GameObject("Rupture");
|
||||
r.transform.position = transform.position;
|
||||
ruptureSystem = r.AddComponent<ParticleSystem>();
|
||||
|
||||
var mainR = ruptureSystem.main;
|
||||
mainR.loop = true;
|
||||
mainR.startLifetime = new ParticleSystem.MinMaxCurve(0.4f, 1.2f);
|
||||
mainR.startSpeed = new ParticleSystem.MinMaxCurve(6f, 14f);
|
||||
mainR.startSize = new ParticleSystem.MinMaxCurve(0.05f, 0.2f);
|
||||
mainR.startColor = new ParticleSystem.MinMaxGradient(
|
||||
new Color(0.4f, 0.05f, 0.05f),
|
||||
new Color(0.7f, 0.1f, 0.1f)
|
||||
);
|
||||
mainR.simulationSpace = ParticleSystemSimulationSpace.World;
|
||||
|
||||
var emissionR = ruptureSystem.emission;
|
||||
emissionR.rateOverTime = 0;
|
||||
|
||||
var shapeR = ruptureSystem.shape;
|
||||
shapeR.enabled = true;
|
||||
shapeR.shapeType = ParticleSystemShapeType.Sphere;
|
||||
shapeR.radius = 3.5f;
|
||||
shapeR.radiusThickness = 0.05f;
|
||||
|
||||
var noiseR = ruptureSystem.noise;
|
||||
noiseR.enabled = true;
|
||||
noiseR.strength = 2f;
|
||||
|
||||
var velR = ruptureSystem.velocityOverLifetime;
|
||||
velR.enabled = true;
|
||||
velR.space = ParticleSystemSimulationSpace.World;
|
||||
velR.z = new ParticleSystem.MinMaxCurve(10f);
|
||||
|
||||
if (ruptureMaterial != null)
|
||||
ruptureSystem.GetComponent<ParticleSystemRenderer>().material = ruptureMaterial;
|
||||
|
||||
ruptureSystem.Play();
|
||||
|
||||
GameObject e = new GameObject("Escape");
|
||||
e.transform.position = transform.position;
|
||||
escapeSystem = e.AddComponent<ParticleSystem>();
|
||||
|
||||
var mainE = escapeSystem.main;
|
||||
mainE.loop = true;
|
||||
mainE.startLifetime = new ParticleSystem.MinMaxCurve(2f, 5f);
|
||||
mainE.startSpeed = new ParticleSystem.MinMaxCurve(15f, 40f);
|
||||
mainE.startSize = new ParticleSystem.MinMaxCurve(0.03f, 0.15f);
|
||||
mainE.startColor = new ParticleSystem.MinMaxGradient(
|
||||
new Color(0.3f, 0.05f, 0.05f),
|
||||
new Color(0.8f, 0.1f, 0.1f)
|
||||
);
|
||||
mainE.simulationSpace = ParticleSystemSimulationSpace.World;
|
||||
|
||||
var emissionE = escapeSystem.emission;
|
||||
emissionE.rateOverTime = 0;
|
||||
|
||||
var shapeE = escapeSystem.shape;
|
||||
shapeE.enabled = true;
|
||||
shapeE.shapeType = ParticleSystemShapeType.Sphere;
|
||||
shapeE.radius = 3.6f;
|
||||
shapeE.radiusThickness = 0.1f;
|
||||
|
||||
var velE = escapeSystem.velocityOverLifetime;
|
||||
velE.enabled = true;
|
||||
velE.space = ParticleSystemSimulationSpace.World;
|
||||
velE.z = new ParticleSystem.MinMaxCurve(25f);
|
||||
|
||||
if (escapeMaterial != null)
|
||||
escapeSystem.GetComponent<ParticleSystemRenderer>().material = escapeMaterial;
|
||||
|
||||
escapeSystem.Play();
|
||||
}
|
||||
|
||||
void UpdateRupture()
|
||||
{
|
||||
float t = Mathf.InverseLerp(1f, 0f, exosphereLevel);
|
||||
|
||||
var e = ruptureSystem.emission;
|
||||
e.rateOverTime = Mathf.Lerp(0, 2000, t);
|
||||
|
||||
if (Random.value < t * 0.5f)
|
||||
ruptureSystem.Emit(20);
|
||||
}
|
||||
|
||||
void UpdateEscape()
|
||||
{
|
||||
float t = Mathf.InverseLerp(1f, 0f, exosphereLevel);
|
||||
|
||||
var e = escapeSystem.emission;
|
||||
e.rateOverTime = Mathf.Lerp(0, 5000, t);
|
||||
}
|
||||
|
||||
IEnumerator DeathBurst()
|
||||
{
|
||||
var e1 = ruptureSystem.emission;
|
||||
e1.rateOverTime = 7000;
|
||||
|
||||
var e2 = escapeSystem.emission;
|
||||
e2.rateOverTime = 12000;
|
||||
|
||||
yield return new WaitForSeconds(0.5f);
|
||||
|
||||
var e3 = ruptureSystem.emission;
|
||||
e3.rateOverTime = 0;
|
||||
|
||||
var e4 = escapeSystem.emission;
|
||||
e4.rateOverTime = 0;
|
||||
}
|
||||
|
||||
public void CleanUp()
|
||||
{
|
||||
if (ruptureSystem != null) Destroy(ruptureSystem.gameObject);
|
||||
if (escapeSystem != null) Destroy(escapeSystem.gameObject);
|
||||
|
||||
if (marsDeath != null)
|
||||
marsDeath.ResetTexture();
|
||||
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user