I’m no expert but I’ve been dealing with UE4 multiplayer for a while.
When a client connects to a server, there are two player controllers that exist: the client version and the server version. Both run the same code and the flow of that code can be controlled using “Authority” switches.
One thing to keep in mind: “Replication” means communication from SERVER to CLIENT. If a client tries to “replicate” something, it will do nothing. So on an actor if you check “Replicates” in the class defaults, this means “If this actor spawns or is destroyed on the server, it will be spawned or destroyed for each connected client as well”.
If you check “Replicate Movement” (or maybe it’s “Movement Replicates”, I don’t remember) AND “Replicates” is checked it means “If this actor moves using a movement component on the server, the corresponding client version of this actor will move as well”.
I believe that is ALL the built in client/server communication that exists. You will need to code the rest yourself. So lets say you have an “Enter” node in your controller blueprint graph to capture when you press Enter on your keyboard and lets say you want this to play a 2D sound at your location. If you connect a “Play sound at location” node, only you will ever hear it - no other connected players will hear it. The way to get this action to broadcast to other players is to first tell the server “I pressed enter” then to have the server replicate to all connected clients. So create a new event, something like “S_PlaySound” and under the event properties for replication use “Run On Server”. This creates an RPC - Remote Procedure Call which is used for one client to communicate information to the server. Also, I prefix my events based on how they are replicated - it makes it easier to see at a glance. S_ for “Run On Server”, C_ for “Run on Owning Client”, MC_ for “Multicast”. But that’s not a requirement. So now connect a call to this “S_PlaySound” to your “Enter” event. If you do a print from S_PlaySound, you’ll see the server prints “Hello”. So now create another new event, called “MC_PlaySound”, for the replication properties set it to “MultiCast” then call it from S_PlaySound. From MC_PlaySound, connect your “Play Sound at Location”.
So to answer your questions
- “Does each player have a single player controller that gives them access to controls”: Effectively, yes. Each player has a single player controller.
- “Does replication mean that no one else has to take a performance hit from the actions (for example if a group of characters is moved, and needs to use event tick to work correctly, does that tick happen on everyone’s machine?)”: This can be optimized how you choose. Not everything needs to be calculated on the server. For example, if you’re trying to decide if a player pawn intersected with a collision box, this is best done on the server - it is the authority. If you want to do something like have a ragdoll corpse get lobbed into the air but it doesn’t really matter where it lands because it’s all just visual effect then it doesn’t really need to be synchronized across all clients. The server can just tell the clients “Lob this actor, simulate your own physics and let it land wherever”.
- “What is the general hierarchy of classes and their purposes when it comes to multiplayer?”: Not certain what you’re asking here but I think the link from the previous post should answer this.