Workflow Enhancements for UE4 Editor

I have some suggestions to improve the UE4 Editor workflow.

  1. I’ve noticed in the Tappy Chicken project or when you create a sizable Blueprint, there could be some performance improvements to the node editing. It can take several seconds each time a parameter is added, or comment is edited, or node has been added.

  2. Once you create input parameters for a custom event the parameter order can’t be changed. So you have to manually create and delete input parameters to change the order. Dragging parameters would be super.

  3. If you create a custom event delegate drawn from a delegate field, the input parameter names and types could be pre-populated. By default custom-event input parameters are blank.

  4. More on custom events, it would be great if input parameters could be selected and copied from one custom event to another.

  5. If you write documentation for your Blueprint, a screenshot feature for the UE4 editor would save time on cropping if there was a way to screenshot only the selected node area in a Blueprint.

  6. The best way to mitigate Blueprints that look like spaghetti is by using custom events. There are still times when a line is being overlapped and if there was a way to move the line with a handle as it could make the diagram more clear.

  7. Timer events are great for game logic, however it would be great to have a timer event that takes delegates with custom input parameters. That way when the timer event fires, you know which actor you were working with if an actor can be passed to the delegate parameter.

  8. When you build for Android after a couple minutes, the publish process produces an install script with the APK. It would save a bunch of time if the install script for Android would auto-run after the APK has built. And then with a shell command, the publish process could auto launch the APK’s intent.

  9. The UE4 editor doesn’t seem have a way to copy blueprints (in the clipboard) from one open project to another. Iit would be great if sections could be copied from one project and pasted to another project.

  10. Building UE4 for Android has a dependency on TADP (Tegra Android Development Pack) 2.X which has some Visual Studio template problems. When will the dependency be upgraded to TADP 3.X which just works much better in Visual Studio?

  11. Blueprint Delegates can’t be called from a thread other than the main thread. Sometimes you have a callback in another thread and you want to invoke the callback on the main thread. It would be super handy if Delegate.ExecuteIfBound was thread safe.

  12. If the UE4 Editor had a Build Last in the Main Editor Layout that’s a single click, it would save a bunch of steps navigating to File->Package Project->Android->Android (DTX) since it would just use that build option from the last time you did a build.

  13. Custom Events in the Event Graph display in the level blueprint “My Blueprint” section under the “Event Graph” node. It would be great if you could drag and drop the custom event into the blueprint to add a call to that custom event. Right now all that does it set the blueprint focus on the custom event. Most commonly I define a custom event once and then call it multiple times. Dragging to the stage like a variable would be a speed up. Sometimes you have to fight to even find your custom event in the context menu. If the context search stops finding custom events, the blueprint might need recompiled/saved or even the UE4 editor might to be restarted before your custom event can be found.

27577-unrealblueprint001.png

  1. When looking at the event graph/blueprint in the UE4 editor, there’s not a File menu item for building to Android. You have to switch back to the main UE4 to build for Android. It would be useful when the level blueprint has focus that the file menu has a publish to Android option.

  2. If Github had a module that could read level blueprint files so it would display an image of the level when browsing the level file on the Github web interface.

Good points, and about the first one, there is “Blueprint compile time and editor performance improvements” listed in 4.7 Feature preview - i hope it will be a noticeable improvement :slight_smile:

  1. Just Copy/Pasted part of complex blueprint from one project into another. custom variables were not found, but it worked :slight_smile:
    using UE 4.6.1

How did you copy the blueprints? I had two instances of the UE4 editor open and tried to copy and paste custom events with callbacks from one project to another but nothing happened…

Personally, i use select nodes → Ctrl+C in one project, and Ctrl+V in second one. But first you must focus blueprint window by clicking somewhere in event graph. Sadly, it’s not possible to copy variables yet.

I know the BP team are working on perf improvements to the editor, compiler and runtime - will probably be an ongoing process though!

Actually you can re-order custom event params! If you expand the parameter options, there is an up and down arrow you can use!

For organizing wired, did you try a ‘reroute node’? If you drag a wire into space that should be one of the options.

There is a ‘Set Timer Delegate’ node now, that might do what you want for timers. It doesn’t support ‘payloads’ yet though I’m afraid.

Copy/paste in the BP editor does export to text on the windows clipboard (try pasting into notepad!), but there are some things I think are disallowed (e.g. function entry/exit nodes).

Executing BP on another thread is currently only done in one tightly-constrained place (anim blend graph evaluation). We are very wary about allowing that in general because of the ability to read/modify game state while it is being modified elsewhere.

Drag/drop of custom events from the My Blueprint tab makes sense I think, I’ll file a feature request!

When it comes to threading, I use an update TIck on an Actor to execute deferred delegate callbacks.
https://github.com/tgraupmann/UnrealEngine/blob/4.6-OUYA/Engine/Source/Runtime/Engine/Private/OuyaSDK/OuyaSDK.cpp#L475

void AOuyaSDK::Tick(float deltaSeconds)
{
Super::Tick(deltaSeconds);
if (_mainThreadActions.size() > 0)
{
#if ENABLE_VERBOSE_LOGGING
__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "Invoke callback from Tick");
#endif
auto & functionPtr = _mainThreadActions[0];
_mainThreadActions.erase(_mainThreadActions.begin());
functionPtr();
}
}

And then I create actions for other threads that will later execute on the main thread.

https://github.com/tgraupmann/UnrealEngine/blob/4.6-OUYA/Engine/Source/Runtime/Engine/Private/OuyaSDK/OuyaSDK.cpp#L511

void CustomCallbacksInitOuyaPlugin::OnSuccess()
{
#if ENABLE_VERBOSE_LOGGING
__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "OnSuccess");
#endif
if (_actor)
{
_actor->_mainThreadActions.emplace_back([]()
{
_actor->OnSuccessInitOuyaPlugin.ExecuteIfBound();
});
}
}

The trouble with this syntax, is that the body of the function blocks can only reference static fields. I haven’t quite figured out how to pass local variables to the anonymous functions.

A cool alternative would be a UMainThreadDelegate that you could invoke from a thread and it would execute on the Actors tick to avoid any thread safe issues similar to what I’ve done.