К основному контенту

Простая вода с вертексной анимацией


Возникла необходимость сделать воду в "мультяшной" стилистике. Без нормал-маппига, блеска и тд, но чтобы двигалась волнами, была красивой, и производительной.

Понадобиться меш-плейн.


Напишем скрипт:

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.

Как решение написал шейдер, который двигает вертексы и текстурные координаты по заданным параметрам вместе с синус-функцией. Код выкладывать не буду потому что - жадина, потратил много времени на него. Продам за миллионы.



А вот как будет выглядеть в игре:

Комментарии