Standard Assetsに入っているWater(Basic)ではしっくり来なかったので、以下の無料アセットに含まれている水のテキスチャ(ノーマルマップ付き)を利用。
Prototype Textures by Dexsoft Games
PlaneなりCubeなり、水面にしたいオブジェクトを用意して、それに上記アセットに含まれているマテリアル「proto_water」を適用。
このままでは動きが無いので、テキスチャのオフセットをずらして動く水面を表現する。
以下のスクリプトを作成して水面オブジェクトにアタッチする。
using UnityEngine; using System.Collections; public class Water : MonoBehaviour { void Update() { Vector2 offset = renderer.sharedMaterial.mainTextureOffset; offset.x = Mathf.Sin(Time.time * 2) * 0.01f; offset.y = Mathf.Repeat(offset.y - 0.001f, 1.0f); renderer.sharedMaterial.mainTextureOffset = offset; renderer.sharedMaterial.SetTextureOffset("_BumpMap", offset); } }
マテリアルのテキスチャのオフセットを取得して、x,yそれぞれずらして再セットする。
ノーマルマップの方にも同じオフセットをそのままセット。
xに関しては-0.01〜0.01の範囲を約3.14秒間で往復する。
周期を変えたい場合はMathf.Sin()に与える引数を調整すると良い。
また、揺れ幅を変えたい場合はMathf.Sin()に掛けている0.01fの値を調整すると良い。
yに関しては毎フレーム0.001fずつ手前にずれるようにしてある。
本来ならdeltaTimeを使って調整すべきかもしれない。
必要無いかもしれないが、Mathf.Repeat()を使って、0.0f〜1.0fの間に収まるようにしている。