Water buoyancy and gameplay

This chapter covers floating objects, kinematic wave followers, gameplay events, optional bridges, global tide, and the script-facing surface APIs.

Buoyancy

Add Water Buoyancy next to a Rigid Body and Collider. The physics system samples the unified WaterSurfaceRequestBus each step.

Buoyancy Settings

FieldPurpose
Sample PointsEntity-local immersion probes; empty = auto 2×2×2 grid from collider AABB
Buoyancy Scale1.0 = exact Archimedes for displaced volume
Linear Drag / Angular DragDrag / damping in water
Flow InfluenceFlow-field thrust coefficient
Wave Sample ModeFull / Height Only / Still Water
Sleep In Still WaterAllow rigid body sleep once stable in calm water
LOD Tier LockAuto or force Tier A–D (Full ?Height Only ?Still ?Frozen)

Boats usually need 6? manual sample points (bow / stern / beam). Too few points in shallow water cause launches—raise drag and add samples.

Requires the water body’s Affects Physics and /O3DE/Gems/Water/PhysicsEnabled. Floater must reside in an active streaming cell (oceans: AlwaysLoaded).

Sample Prefabs: AutomatedTesting/Prefabs/Water/BuoyantCrate, Driftwood, SimpleBoat.

Surface attachment

Water Surface Attachment follows waves kinematically (no rigid body)—buoys, markers, towed floats.

FieldPurpose
Anchor ModeFixed Rest Point (moored) or Follow Entity XY (towed)
Align To SurfaceTilt up axis onto the wave normal
Smoothing TimeFirst-order lag seconds (0 = exact pin)
Out Of WaterHold Last Position or Follow Rest Point when uncovered

Script / C++: WaterSurfaceAttachmentRequestBus (SetRestAnchor, SetAttachmentEnabled, ?. Internally uses GetDisplacedSurfacePosition (Lagrangian rest XY ?displaced world point).

Events

Per floater ?WaterNotificationBus (addressed by floating EntityId)

EventMeaning
OnEnteredWaterCrossed into water; carries water body id + sample
OnExitedWaterLeft water
OnSubmersionChangedSubmerged fraction 0? (1/16 steps)

Global ?WaterSystemNotificationBus

EventMeaning
OnCameraEnteredWater / OnCameraExitedWaterCamera underwater transitions
OnBodyEnteredWaterSame as enter, plus enterSpeedMps (splash gating)
OnBodyExitedWater / OnBodySubmersionChangedGlobal mirrors of per-body events

Bridges

BridgeRole
SurfaceDataPublishes water / underwater / riverbank when Emits Surface Tags is on
Navigation3DRegisters active bodies as underwater regions for hybrid routing
Particle (WaterParticleBridgeComponent)Maps enter / exit / camera / submersion to OpenParticleSystem (optional Gem)

Particle asset paths and thresholds live under /O3DE/Gems/Water/Particles/ (SplashParticleAsset, BubbleTrailParticleAsset, CameraBubblesParticleAsset, MarineSnowParticleAsset, SplashMinEnterSpeed, EffectLifetimeSeconds).

Tide and per-body control

APIEffect
WaterSystemRequestBus::SetGlobalTideOffsetUniform still-water offset (usable ± a few meters; no mesh rebuild)
Body Affected By Global TideOpt out for mountain reservoirs
WaterBodyRequestBus::SetWaterLevelOffsetPer-body still-water offset
WaterBodyRequestBus::SetWavesEnabledRuntime wave toggle (cutscenes)

Script and C++ surface APIs

BehaviorContext category: water (Lua / Script Canvas / C++).

BusScript-bound
WaterSurfaceRequestBusGetWaterSurfaceSample, height, IsPointUnderwater, flow, GetDisplacedSurfacePosition
WaterSystemRequestBusGet/SetWaterTime, ClearTimeSource, Get/SetGlobalTideOffset
WaterBodyRequestBusSet/GetWaterLevelOffset, SetWavesEnabled
WaterSurfaceAttachmentRequestBusRest anchor, enabled
Notification handlersFloater + system events above

C++ only (not script-reflected): SetTimeSource, GetWaterInfoRaster, batch GetWaterSurfaceSamples, internal NotifyGlobalTideChanged.

Sample flags for queries: Default, HeightOnly, StillWater, IgnoreFlow (see Core concepts).

#include <Water/WaterSurfaceRequestBus.h>
#include <Water/WaterSystemRequestBus.h>

Water::WaterSystemRequestBus::Broadcast(&Water::WaterSystemRequests::SetGlobalTideOffset, 0.4f);

bool underwater = false;
Water::WaterSurfaceRequestBus::BroadcastResult(
    underwater, &Water::WaterSurfaceRequests::IsPointUnderwater, worldPosD);

Dry volumes and gameplay

Queries that fall inside a Water Dry Volume miss as if no water were present—useful for dry interiors inside a lake or ocean XY footprint. See Authoring#dry-volume.

Next steps

  • Recipes ?boat sampling and estuary float tests.
  • Debugging ?floater count and probe on the overlay.
  • Reference ?full bus / component checklist.

Copyright © 2026 DawnEngine. All rights reserved.

DawnEngine is a commercial 3D engine distributed under the DawnEngine end-user license agreement. Engine binaries and source are proprietary and are not covered by the licenses below.

Documentation only: the prose and templates on this site are a derivative work of Open 3D Engine (O3DE) documentation by the O3DE Contributors, used under CC BY 4.0 (documentation content), Apache 2.0 (site code), and the MIT license (inline code samples).

The open-source 3D engine that DawnEngine is built on top of is Open 3D Engine . DawnEngine is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the O3DE project. “O3DE” and “Open 3D Engine” are trademarks of The Linux Foundation.