Moving water with a hole in it

I’m working on a ship-related game and I’m trying to find a way to let players make use of decks underwater. My best solution right now is a mostly transparent piece of glass covering the open area of the ship to hide a piece of a barely transparent water part:

Which looks nice there but it relies on a bug so I’d rather use something more reliable. This also causes some other problems like hiding anything transparent below the waterline and screwing with other images on the water surface. I’ve experimented a little with making the water part a union with the profile of the ship cut out, but I can’t think of a good way to make the water surface appear to be moving.

A thing to note in this game is the map moves around the ship, but that shouldn’t matter too much because I can make the water independent of that if needed. I think that rules out terrain water though.

So yeah does anyone have any ideas or weird gui properties I’ve never heard of that could be useful?


Is this a game with an orthographic view?
Or would the player in the underwater decks never be able to see outside of the ship?

1 Like

There’s an orthographic-ish camera mode when you’re building like in the gif, which lets you move up and down from deck to deck (example). But you can also walk around your ship with the normal character mode. If you’re walking around on the deck below water you can’t see outside, but you might see from one deck to another through a stairwell.

1 Like

Could you not just detect if the player’s camera is below the top deck and locally make a water part invisible? Just throw on some code to detect if the player is on the ship as well


Yeeah but that’s not a perfect solution. What if the player was on a middle deck looking out a window?

For Roblox Titanic 2.0 I detect if players are in a room that is under the water-line, as such

I also check the Y position to make sure the player is truly in the room under the water line, not just in the ship mid-deck

1 Like

I might end up doing something kinda like that, but there still might be cases where a player is on a deck just above water, with both the ocean in view plus some stairs down to the deck below. Maybe I’ll just make sure the stairwells are behind doors without windows ¯\_(ツ)_/¯

Edit - Also I forgot that doesn’t help much with the overhead build mode where you see everything

I suppose when viewing underwater decks I could just not show the water at all, and show the rest of the hull and the seafloor below instead

1 Like

I think that for now it’s safe to use the way you are doing it, sure, it utilizes a glitch - but if I’m not mistaken we’ve had confirmation that if this glitch is patched in the future they will give us a way to do it that is actually endorsed as a feature.

Not at all guaranteed.


If you had such a ship moving around in smooth terrain water, you can actually remove and replace the water quickly enough with FillBlock (using air and water) to maintain an air pocket inside the ship. But you would have to work within the limits of the voxel system, which could mean generous hull thickness to hide the air-water boundary, or some camera trickery to fake diagonal motion so that your ship is always voxel aligned.

1 Like

I would use smooth terrain water, but the ship doesn’t move at all, the map moves to give that illusion. So I don’t think there’s any way to make the terrain water look like its flowing in any direction.

Maybe make a block that only one player can see that fits around the hull like a glove and have that for each player. So It looks smooth. Idk I’m not very good with scripting I’m working on it tho.

Yeah that works with a union, but I can’t think of a way to make it look like that part has waves moving across it. If I put a SurfaceGui on the union it ignores the hole and passes through the ship. If I use a decal it respects the hole but I can’t think of a good way to animate a decal.

I would use multiple parts (parts, wedges, etc) to fit around the ship, and animate a texture on the surface locally from there. This way, you have an exact hole in the center and you can locally hide/show individual parts as needed.