Понадобиться меш-плейн.
Напишем скрипт:
using UnityEngine; using System.Collections; public class SinWater : MonoBehaviour { public Vector2 range = new Vector2(0.1f, 1); public float speed = 1; public float maxY = 0.5f; public float offXMax = 0.1f; public float offYMax = 0.1f; public float offXSpeed = 0.1f; public float offYSpeed = 0.1f; private Mesh mesh; private Material mat; void Start() { mesh = GetComponent<MeshFilter>().mesh; mat = GetComponent<Renderer>().material; } void Update() { Vector3[] vertices = mesh.vertices; Vector3[] normals = mesh.normals; int i = 0; while (i < vertices.Length) { vertices[i].y = Mathf.Sin(Time.time * speed) * maxY; if (i % 2 == 0) vertices[i].y *= -1; i++; } mesh.vertices = vertices; Vector2 off = mat.GetTextureOffset("_MainTex"); off.x = Mathf.Sin(Time.time * offXSpeed)* offXMax; off.y = Mathf.Sin(Time.time * offYSpeed)* offYMax; mat.SetTextureOffset("_MainTex", off); } }
Видим:
Работает с любым шейдером, но посмотрите на свойства:
А теперь в профайлер:
Каждый кадр переформируется меш, и куча мусора из структур Vector3. Все это нужно убирать GC.
Как решение написал шейдер, который двигает вертексы и текстурные координаты по заданным параметрам вместе с синус-функцией. Код выкладывать не буду потому что -
А вот как будет выглядеть в игре:
Комментарии
Отправить комментарий