2017-04-12 01:23:07 +09:00

143 lines
3.2 KiB
C#

using UnityEngine;
[ExecuteInEditMode]
[AddComponentMenu("Destructible 2D/D2D Water")]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class D2D_Water : MonoBehaviour
{
public Color WaveColour = Color.blue;
public int WaveCount = 10;
public float WaveWidth = 1.0f;
public float WaveThickness = 1.0f;
public float WaveAmplitude = 1.0f;
public float WaveFrequency = 1.0f;
public float WaveOffset;
public float WaveAge;
public float WaveSpeed = 0.1f;
public Color SeaColour = Color.black;
public float SeaDepth = 10.0f;
public Texture2D NoiseTex;
[HideInInspector]
[SerializeField]
private MeshFilter meshFilter;
private Mesh mesh;
private Vector3[] positions;
private Color[] colours;
private Vector2[] uvs;
private int[] indices;
protected virtual void Update()
{
if (meshFilter == null) meshFilter = GetComponent<MeshFilter>();
if (mesh == null)
{
mesh = new Mesh();
mesh.hideFlags = HideFlags.DontSave;
}
// Prevent this from dirtying the scene when exiting play mode
D2D_Helper.StealthSet(meshFilter, mesh);
// Generate positions?
if (positions == null || positions.Length != WaveCount * 3 + 3)
{
positions = new Vector3[WaveCount * 3 + 3];
}
// Generate colours?
if (colours == null || colours.Length != WaveCount * 3 + 3)
{
colours = new Color[WaveCount * 3 + 3];
}
for (var i = 0; i <= WaveCount; i++)
{
colours[i * 3 + 0] = WaveColour;
colours[i * 3 + 1] = SeaColour;
colours[i * 3 + 2] = SeaColour;
}
// Generate uvs?
if (uvs == null || uvs.Length != WaveCount * 3 + 3)
{
uvs = new Vector2[WaveCount * 3 + 3];
}
// Generate indices?
if (indices == null || indices.Length != WaveCount * 12)
{
indices = new int[WaveCount * 12];
for (var i = 0; i < WaveCount; i++)
{
// Wave
indices[i * 12 + 0] = i * 3 + 0;
indices[i * 12 + 1] = i * 3 + 1;
indices[i * 12 + 2] = i * 3 + 3;
indices[i * 12 + 3] = i * 3 + 4;
indices[i * 12 + 4] = i * 3 + 3;
indices[i * 12 + 5] = i * 3 + 1;
// Sea
indices[i * 12 + 6] = i * 3 + 1;
indices[i * 12 + 7] = i * 3 + 2;
indices[i * 12 + 8] = i * 3 + 4;
indices[i * 12 + 9] = i * 3 + 5;
indices[i * 12 + 10] = i * 3 + 4;
indices[i * 12 + 11] = i * 3 + 2;
}
}
// Make waves move?
if (NoiseTex != null)
{
WaveAge += WaveSpeed * Time.deltaTime;
var halfSize = WaveCount * WaveWidth * 0.5f;
for (var i = 0; i <= WaveCount; i++)
{
var sample = NoiseTex.GetPixelBilinear(WaveOffset + i * WaveFrequency, WaveAge).r - 0.5f;
var x = i * WaveWidth - halfSize;
var y = sample * 2.0f * WaveAmplitude;
positions[i * 3 + 0] = new Vector3(x, y , 0.0f);
positions[i * 3 + 1] = new Vector3(x, y - WaveThickness, 0.0f);
positions[i * 3 + 2] = new Vector3(x, y - SeaDepth , 0.0f);
}
}
// Update mesh
mesh.Clear();
mesh.vertices = positions;
mesh.colors = colours;
mesh.triangles = indices;
mesh.uv = uvs;
mesh.RecalculateBounds();
mesh.RecalculateNormals();
}
protected virtual void OnDestroy()
{
D2D_Helper.Destroy(mesh);
}
}