Short and painful
If a function in a parent blueprint hasn’t a return value, it’s not possible to override it in a derivated blueprint.
If you press the override button in blueprint editor, it only lists functions of super class that return something.
UE4 considers functions of super class as events (which they arent’t, because in this case we would be allowed to do asynchronous stuff there).
That’s very annoying to work around currently: Instead of just overriding them like expected you have to catch an event with same name in event graph and add a call to parent event. That’s very confusing.
That’s not actually a bug, but intended. bug was reporting was that a function in Parent BP that didn’t have an output would not show up in list for Overridable functions in My Blueprint tab inside its Child BP. That has been fixed.
Under hood, events are implemented as functions. It dates way back, when Blueprint system was still in its infancy. One of only ways we have to discern between two is presence of a return value.
This was for native C++ functions that were exposed to Blueprints. unfortunate side effect of this is that it also affected functions added through Blueprints, something that probably wasn’t originally thought of.
Events are triggered just as a function would be, only repercussion is that event is run in Event Graph: it utilizes graph’s persistent state, rather than one that is reset with each function call. This means you can’t use things like local variables, etc.
I talked with devs about it, and they said this is something that’s plagued them for a while and they want to correct, as it’s super confusing. I’ll follow up to see if we have any specific plan for that. For now, though, it’s just way it’s set up in this instance =/
many thanks for making this clear for me. If that will change some day in future I can live with that.
Only one thing: Would it be possible to declare specific events as private like a function (it should not be possible to call them from outside this class)?
Currently we can’t set a custom event to private like you can with Access Specifier in functions. There’s an existing feature request for that entered recently (UE-19803), and I’ll keep an eye on it and post here if I see it get implemented.