Files
reedgamingstudio 5b8ebb7a35 test
testing
2014-12-16 00:23:12 -06:00

2 lines
3.1 KiB
C#

using UnityEngine;
using System.Collections;
[RequireComponent (typeof (Detonator))]
[AddComponentMenu("Detonator/Heatwave (Pro Only)")]
public class DetonatorHeatwave : DetonatorComponent {
private GameObject _heatwave;
private float s;
private float _startSize;
private float _maxSize;
private float _baseDuration = .25f;
private bool _delayedExplosionStarted = false;
private float _explodeDelay;
public float zOffset = .5f;
public float distortion = 64;
private float _elapsedTime = 0f;
private float _normalizedTime;
public Material heatwaveMaterial;
private Material _material; //tmp material we alter at runtime;
override public void Init()
{
//we don't want to do anything until we explode
}
void Update ()
{
if (_delayedExplosionStarted)
{
_explodeDelay = (_explodeDelay - Time.deltaTime);
if (_explodeDelay <= 0f)
{
Explode();
}
}
//_heatwave doesn't get defined unless SystemInfo.supportsImageEffects is true, checked in Explode()
if (_heatwave)
{
// billboard it so it always faces the camera - can't use regular lookat because the built in Unity plane is lame
_heatwave.transform.rotation = Quaternion.FromToRotation(Vector3.up, Camera.main.transform.position - _heatwave.transform.position);
_heatwave.transform.localPosition = localPosition + (Vector3.forward * zOffset);
_elapsedTime = _elapsedTime + Time.deltaTime;
_normalizedTime = _elapsedTime/duration;
//thought about this, and really, the wave would move linearly, fading in amplitude.
s = Mathf.Lerp(_startSize,_maxSize,_normalizedTime);
_heatwave.renderer.material.SetFloat("_BumpAmt", ((1-_normalizedTime) * distortion));
_heatwave.gameObject.transform.localScale = new Vector3(s,s,s);
if (_elapsedTime > duration) Destroy(_heatwave.gameObject);
}
}
override public void Explode()
{
//try to early out if we can't draw this (not sure if this also gets us out of Unity Indie)
if (SystemInfo.supportsImageEffects)
{
if ((detailThreshold > detail) || !on) return;
if (!_delayedExplosionStarted)
{
_explodeDelay = explodeDelayMin + (Random.value * (explodeDelayMax - explodeDelayMin));
}
if (_explodeDelay <= 0)
{
//incoming size is based on 1, so we multiply here
_startSize = 0f;
_maxSize = size * 10f;
_material = new Material(Shader.Find("HeatDistort"));
_heatwave = GameObject.CreatePrimitive(PrimitiveType.Plane);
Destroy(_heatwave.GetComponent(typeof(MeshCollider)));
if (!heatwaveMaterial) heatwaveMaterial = MyDetonator().heatwaveMaterial;
_material.CopyPropertiesFromMaterial(heatwaveMaterial);
_heatwave.renderer.material = _material;
_heatwave.transform.parent = this.transform;
_delayedExplosionStarted = false;
_explodeDelay = 0f;
}
else
{
_delayedExplosionStarted = true;
}
}
}
public void Reset()
{
duration = _baseDuration;
}
}