As a Roblox developer it is currently too difficult to achieve animated texture effects on curved surfaces.
The use-cases
There are many 20+ year old games that achieve incredible visual effects by simply applying scrolling textures onto curved surfaces. Below are some examples of beautiful effects you could create with this approach.
Water streams
In The Legend of Zelda: The Wind Waker (2003) scrolling textures are used to create the illusion of a water stream.
Quicksand
In Super Mario Galaxy (2007) scrolling textures are used frequently for waterfalls but also for quicksand.
Animated signs
In Mario Kart: Double Dash (2003) scrolling textures are used to animate the arrows on these animated signs.
The problem
Roblox currently offers very little options for artists to animate static surfaces. And the options we do have can only be used in very specific cases. Here are some of the options we have currently and why none of them work well on curved surfaces.
SurfaceGui
Although SurfaceGuis would work well to animate billboards, they do not have the option to curve with a surface. As such they cannot be used to create any of the above effects.
Beam
When you want to animate a surface by sticking a Beam on it, you will always have to offset your Beam because it will otherwise flicker against the surface it is on, or in other words ‘cause Z-fighting’.
On top of that, Beam instances cannot easily wrap around curved surfaces given the limited number of segments you work with. Especially considering that lower end devices which will automatically reduce your ‘Segments’ property you will often end up ‘clipping’ the beam into the curved surface’s geometry.
MeshPart.TextureID
You could theoretically animate a curved surface if that geometry is created through a MeshPart. However, for each ‘frame’ in the animation you would need a unique texture which completely overflows your memory budget.
Texture
Like with MeshPart.TextureID, Texture instances actually properly maps onto a curved surface. The OffsetStudsU and OffsetStudsV properties can also be used to create a scrolling texture of sorts. However, developers have no control over how exactly Texture instances map their image onto a mesh. From how I understand it the texture is simply projected orthographically onto the triangles of the mesh depending on the triangles’ surface normals’ directions.
Given the lack of projection control there is also no way to use a Texture instance to create an ‘outwards pulsing’ effect such as in the quicksand example. You also cannot add any sort of wobble required to achieve the effect of the water stream example.
A potential solution
One potential solution that would enable developers to create effects similar to the examples above would be to add a ‘UV offset’ property of sorts. If a developer has properly UV-unwrapped their mesh, they should be able to create all of the effects above by simply shifting their mesh’s UV map on the X-axis or Y-axis.
Below is an example of a smoke cloud I created in which the cloud texture properly rotates around the curved surface simply by moving the UV map to the left or right.
And here is a quick-and-dirty example of how you could use this same feature to create a quicksand effect.
Note that I am only providing some implementation ideas here. I do not care about the actual implementation so long as developers are enabled to create the aforementioned visual effects.