How good systems are made?

Hey, got a few questions about how I’m setting up my system, and I figured reaching out here might help clear things up. DevForum seems like a great place to pick up some insights, so here goes:

Animations:
I’ve read that animations tend to work better when loaded by the client for player use and on the server for other purposes. I was wondering if it’s a good idea to create an Animation Handler as a ModuleScript to manage game animations. Essentially, loading them directly into this handler when the game starts, both for client and server animations, and then using them when needed. What are your thoughts on this?

Sounds:
For the sound system, I’m assuming using PreloadAsync and organizing them in the SoundService. Is it necessary to Play() all sounds on the client? Play() them on the server doesn’t seem necessary to me, but I’d like to confirm.

UI:
Now, UI has been a bit tricky for me. Let’s say I have a UI for selecting game modes. Currently, I’m placing the UIs in StarterGui with transparency set to 1. When the server wants them to appear, I use a remote event to set transparency to 0 and another to revert it back to 1. However, I’m starting to feel like this approach is a bit messy. Any common practices you’d recommend? I’ve also experimented with storing the UI on the server and then transferring it to PlayerGui directly. Still unsure if that’s a good move.

On another note, learned a ton from free models, especially from Adonis and other open-source projects. If you have any good open-source projects to share, I’d be extremely grateful.
Thank you for reading.

Generally, I like to load things on the client (particles, sounds, small things), it lessens server load and ping, however anything on the client can be exploited, so I recommend loading things with little to no impact if they are exploited.

For animations, you should probably load them into the Handler you mentioned. I’d probably separate client and server animations, though. You could have two separate Handlers (also, animations that animate the character replicate to the server when played for the client, animations on anything else like models will not replicate and those should be played on the server or fired to all clients).
I’m not great with sound so I don’t have an opinion on this :sob:.

UI should be accessed through Player Gui, you can also set the GUI to visible or enabled instead of changing its transparency.

Edit: Also, if you think you are going to be using a specific function or anything like that multiple times throughout various scripts, put it in a module. Try not to repeat yourself. I also like making most of the functions I use modular so I can reuse them and edit them by changing parameters.

Firstly, thank you very much for writing this. I had forgotten that there is a property called Enabled in a ScreenGui, especially since my games usually have only one ScreenGui, and now I understand why many people create ScreenGui for various interface systems.