campfire/Assets/LowPolyWater_Pack/Scripts/LowPolyWater.cs

101 lines
3.1 KiB
C#

using UnityEngine;
namespace LowPolyWater
{
public class LowPolyWater : MonoBehaviour
{
public float waveHeight = 0.5f;
public float waveFrequency = 0.5f;
public float waveLength = 0.75f;
//Position where the waves originate from
public Vector3 waveOriginPosition = new Vector3(0.0f, 0.0f, 0.0f);
MeshFilter meshFilter;
Mesh mesh;
Vector3[] vertices;
private void Awake()
{
//Get the Mesh Filter of the gameobject
meshFilter = GetComponent<MeshFilter>();
}
void Start()
{
CreateMeshLowPoly(meshFilter);
}
/// <summary>
/// Rearranges the mesh vertices to create a 'low poly' effect
/// </summary>
/// <param name="mf">Mesh filter of gamobject</param>
/// <returns></returns>
MeshFilter CreateMeshLowPoly(MeshFilter mf)
{
mesh = mf.sharedMesh;
//Get the original vertices of the gameobject's mesh
Vector3[] originalVertices = mesh.vertices;
//Get the list of triangle indices of the gameobject's mesh
int[] triangles = mesh.triangles;
//Create a vector array for new vertices
Vector3[] vertices = new Vector3[triangles.Length];
//Assign vertices to create triangles out of the mesh
for (int i = 0; i < triangles.Length; i++)
{
vertices[i] = originalVertices[triangles[i]];
triangles[i] = i;
}
//Update the gameobject's mesh with new vertices
mesh.vertices = vertices;
mesh.SetTriangles(triangles, 0);
mesh.RecalculateBounds();
mesh.RecalculateNormals();
this.vertices = mesh.vertices;
return mf;
}
void Update()
{
GenerateWaves();
}
/// <summary>
/// Based on the specified wave height and frequency, generate
/// wave motion originating from waveOriginPosition
/// </summary>
void GenerateWaves()
{
for (int i = 0; i < vertices.Length; i++)
{
Vector3 v = vertices[i];
//Initially set the wave height to 0
v.y = 0.0f;
//Get the distance between wave origin position and the current vertex
float distance = Vector3.Distance(v, waveOriginPosition);
distance = (distance % waveLength) / waveLength;
//Oscilate the wave height via sine to create a wave effect
v.y = waveHeight * Mathf.Sin(Time.time * Mathf.PI * 2.0f * waveFrequency
+ (Mathf.PI * 2.0f * distance));
//Update the vertex
vertices[i] = v;
}
//Update the mesh properties
mesh.vertices = vertices;
mesh.RecalculateNormals();
mesh.MarkDynamic();
meshFilter.mesh = mesh;
}
}
}