101 lines
3.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |