So, after a lot of reading and trial-and-error, I managed to come up with a solution, which I’m posting here in case anyone else gets hung up trying to do something similar.
First and foremost, it appears that trying to do client input directly on a Blueprint class (especially once it’s been placed in a level via the editor) just plain doesn’t work. Not sure if this is intentional or not but it looks like my theory about the actor being owned by the server was accurate.
I managed to do a quick test using GetActorTransform/SpawnActor on a SpawnPoint as illustrated in Epic’s Content Examples / Networking / 1.1 just to prove that something spawned into the level and thereby not owned by the server would take client input directly from the Blueprint class’ Event Graph but this technique causes all sorts of other problems like the Actor only being visible on the client and not having collision by default and such that I didn’t want to have to deal with, so…
I ended up abandoning the Blueprint class’ Event Graph for the most part and instead did the input handling on the Player Controller (MyCharacter in my case), which I’ve come to learn is the generally-accepted best place to do such things.
Though I’ve come to understand the reasoning behind the idea of putting all input handling on the Player Controller (especially in a client/server multiplayer context), I do still kinda wish I could have made it work entirely on the Blueprint itself if only to make it more portable/modular but I digress.
Ultimately, all it took was a bit of a re-think as to how I’d refer to things within the Blueprint being removed from the context of the Blueprint class.
Here are the additions I had to make to my Player Controller (MyCharacter) Event Graph and the little bit of functionality I left on the Blueprint itself (where everything used to be).
The big changes here are having to identify and refer to the actors in the level themselves as opposed to he class as a whole– hence GetAllActorsOfClass. Also note that I’m now setting a non-Replicated variable in the Blueprint class (IsInRange) just to make sure that the Player Controller is in range of the console/button when they Interact (hit the E key).
I’m honestly not sure if there is another viable/better way to accomplish something like this. I experimented with EventDispatchers and a few other things but this was what ultimately worked for me.
If any of you UE4 gurus have any insights into any of this, I’d love to read them. I’m starting to feel like less of a newbie after having figured this out but I’ve still got a lot to learn and would appreciate any helpful feedback folks might have.
Thanks!