What you’ve described is pretty much how UR4 works, so I’m confused about why you’re confused. I think you need to study the collision mechanism more closely.
This:
has been absolutely worth its weight in gold to me. I mean, that’s not right because it’s just a bunch of bits on a webserver somewhere; more like it’s worth a lot, I guess.
As far as event dispatchers go, I don’t think you’ve quite got it. Event dispatchers aren’t (usually) used for one-to-one events (e.g., pawn->controller->hud) but for one-to-many, many-to-one and many-to-many events.
For example, suppose you had a game in which there were two teams.
Without event dispatchers: Each member of a team might have an array of pawns (or controllers) to keep track of their teammates (or, more likely all players). When a member of team gets in trouble (e.g., taking fire, needs healing, etc.) you would loop through the teammate array calling an event on each same-team pawn (or controller) to indicate to the team to help (the HelpMe event). This is pretty complicated and doesn’t scale very well. Each player has an array of pawns/controllers, has their own for loop, etc. Now it’s not terrible, but suppose you had 20 such events. Yuck. Now suppose one of those players dies. You need to do one of two things: either ignore the dead player (your for loop now has a new conditional) or you remove the player from each array “owned” by the player by calling yet another event on each pawn/controller (“PlayerDied”).
With event dispatchers: On pawn/controller BeginPlay you bind to globally available event dispatchers to receive the HelpMe, and whatever other events you need to receive globally (you probably don’t actually need a PlayerDied event). The HelpMe event has as a parameter the player/controller to indicate who needs help. If the player/controller is on your team you respond one way and otherwise ignore it (or whatever). When a player dies you unbind all events from that player/controller.
So, with event dispatchers there’s no looping, no arrays, nothing to keep track of other than THIS player. You can certainly keep track of other things if you need to, but with event dispatchers, it’s not required in the same ways as without them. One way you can think about it is that the event dispatchers keep track of the arrays and performs the loops you would.
Event dispatchers tend to make your code/BP cleaner and more concise and keep your class variables less cluttered (the event dispatchers will tell you who/what “needs the thing”, rather than you iterating through a list to figure it out).