And why on earth do you want that to be a visual only effect?
Shpuld you not be moving the water sheet(s) up and down physically so that collisions with it, distance to nearest surface, etc. Match up?
Really. Dump the engine s*it and make your own.
At a base level, 1c++ class called ocean manager that handles the wave.
It, will have a blueprint accessible function that returns the Z value at x/y for Gametime.
Taking into account the tide level that offsets the overall Z plane ofc.
This function probbaly also has to be in its own thread.
Simplistic math as it may be, you can easily clog up a CPU by queriing too many times.
I wouldnt necessarily go Async because you need the value returned in the correct frame for that gametime or for gametime + a frame to get the position of the next frame and make it so that the correct height is applied.
Anyway, these are details. Start with the basic class, and the functions.
Then, and once you wrote the grstner yourself in c++ probbaly off the old GPU gem articles youll have an easier time with this, you create the same grstner function in a material function.
Then, you add the function to a singlelayerwater material (or you make your own water material which may provide brtter results. Single layer water is faster and does some things you wouldnt have to do yourself).
Then, you will likely botice that the waves are causing display issues and look like they have holes on a single tile where they possibly couldnt.
Thats due to Z sorting and the engine generally sucking at depth detection when its offset by a shader. Theres various fixes for it. If you run into it i probably posted solutions 3 or 4 years ago on this forum.
OR, you can grab the community ocean project and look at some of their materials to see how they handle the sorting. Theres several ways, some look better some perfrom better.
You use whatever you think your project can deal with.
At this point you have a material and a function which both return the same value (provided the function is aware of the Z location of the water sheet).
You can start to do actual sruff with other components… like creating a component which when placed on an object keeps its Z in sync with the wave.
And you can start having a great xmas with figuring out the correct way to handle bouyancy with multiple points of contact - so that a floating doughbut can incline on the wave.
(Or you can just get the wave normal of the impact point and rotate the ■■■■ thing incorrectly at 1/16th of the processing cost? Probably a better idea…)
You better get familiar with C++/C#/ other .net trash.
Arduino has an entierly different way of thinking programmatically - its sequential.
Everything else is not.
Particularly if the need is to get some sort of physics simulation, you better start with being aware that the result is probably not going to be as accurate as a mathematical model of it.
Particularly not in Unreal. Particularly not using Chaos.
If the need is mostly visual, youll have no big issues.
After you get done with creating the water shader, read up on flow maps, and start to implement that so you can provide interactivity - ripples and such, at runtime.