Stylized Water 3
4.2.Components & Utilities
Water Object
You’ll find this component on every prefab. It merely provides an easy way to identify which objects in the scene represent water. Currently, the Planar Reflection Renderer component and Height Query System make use of this.
The component caches the mesh and material used, so these can be retrieved instantly. Next to providing access to a MaterialPropertyBlock. The transform may also be used, to fetch the water level.
Water Mesh asset
The package comes paired with a utility that can generate plane or circle meshes, to be used with the water shader. This makes it easy to add subdivions to a mesh, without having to leave Unity. When using waves, a mesh requires a sufficient vertex density.
To create one:
Right-click in the project window and go to Create->Water->Mesh. This creates a new .watermesh
asset, which is essentially a regular mesh, so can be assigned to any Mesh Filter component.
API
The StylizedWater3.WaterMesh
class can instantiated, in order to create a mesh through custom scripts. You can change any of the public properties, then call the Rebuild()
function to generate a mesh using the current settings.
Or access the static StylizedWater3.WaterMesh.Create
function to create a mesh directly.
Water Grid
This component lives up to its name, it creates a grid of water meshes around its position.
It can created through:
- Add Component->Stylized Water 3->Water Grid
- GameObject->3D Object->Water->Grid
The “Follow target” transform field can be set so the grid follows this around on the XZ axis. The position is snapped to the nearest vertex, so waves will not appear to wobble when the grid is moved.
This can be utilized to create water tiles for streaming systems, or faking an infinite ocean to some extent.
For oceans, see the Ocean page
Align Transform To Water
This component makes a Transform to align the water surface, useful for decorative elements. It does so by sampling the water’s height at 4 points in a ➕-shaped pattern. From these points, a normal vector is also derived, which in turn is used to rotate the transform.
- Because the script sets the orientation of the Transform, modifying all axis, it cannot be rotated manually or through other scripts. Instead, set the rotation of the child objects directly.
- If a RigidBody is attached to the same object, the script uses RigidBody.MovePosition instead of setting the Transform directly. Note gravity will be disabled for it. Otherwise gravity will attempt to pull down the object, creating a constant tug war between the Physics and Transform domains!
- This script alters the transform’s Y-position, so it cannot be modified by anything else, except the “rotation” parameter. The X/Z position of the transform can be changed freely by other actors.
- The term “Buoyancy” is purposely never used to describe this component, since no physics are involved.