BeginPlay is, in fact, effectively ‘running twice’ (that is, it’s running once on each connected client) – because a game, by its nature, must ‘begin’ for each individual player.
A class is only constructed once, at runtime, and therefore it will only call BeginOverlap and EndOverlap once, and only for the local client. That’s my understanding of the process, at least.
To stop the log from reporting twice in BeginPlay, add an authority guard ( (if (HasAuthority() ) to the log message; that should ensure that only the server has permission to write to the log.
Note, however, that HasAuthority will not prevent log output from appearing twice if a given instance of PlatformsToTrigger is populated by references to two identical platform actors; it’s a good idea to occasionally double-check that you’re not trying to trigger the same platform twice on one trigger.