Michal Smolen - Niagara UI Renderer

Video: https://youtu.be/iFa40Sf4QPA

The Niagara UI Renderer Plugin adds a Niagara Particle System Widget that allows you to render Niagara particle systems directly into the UI. The plugin supports sprite and ribbon CPU particles.

With this plugin you can finally use Niagara particles in the UI, without the hassle of creating expensive render targets. Just drag the Niagara System Widget into your widget blueprint, select your Niagara particle system, add your materials into the Material Remap List and you're good to go! For the step by step guide, please visit the documentation.

This plugin was tested on Windows and Android, but it should work on other platforms too. They are not officialy supported, because I don't have a way to test in on the other platforms.

You can use "stat NiagaraUI" console command to check the performance of your particle systems. In my test scene running on an AMD Ryzen 9 5900X, it took 0.05ms to generate the sprite data and 0.1ms to generate the ribbon data for 1,000 particles.

If you want to get help getting started with this plugin, you can take a look at the tutorials:

Beginner Tutorial

Intermediate Tutorial

Advanced Tutorial

Features:

  •  Adds a Niagara System Widget

  •  Supports CPU particles only

  • Supports Sprite and Ribbon particles

  •  Allows remapping particle materials to the UI materials in the widget itself

  • Automatically convert particle materials to the UI materials

  • Directly transfers the widget location to the actor location so it supports moving / animating the widget

Does this plugin support for iOS?
Supported Target Platforms - has only android and windows

Hi, the answer is in the FAB FAQ section for this plugin. Cheers!

will there be the ability to use mesh renderers in the future?
I have also noticed that if you change the pivot of a sprite in niagara, it ignores this in a widget

Hi, unfortunately the current feature set is pretty limited, and the mesh renderer and a custom pivot position are only two of many features that aren’t supported.

I was looking into fully rewriting the rendering to do it in a more proper way instead of using slate’s mesh widget, but I’ve only managed to get a proof of concept running. This would allow for more complete feature set and way better performance, but there’s still a ton of work. Therefore I don’t want to promise anything, especially since I don’t have much time to work on it.

After the full rewrite a mesh renderer support would be theoretically possible, but it still introduces more issues as how to deal with perspective projection of the mesh, how to light it, what scene data to pass in etc.

The UI material does not support the “Dynamic Parameter” node. After the automatic replacement, this node will no longer function. What are the solutions to this problem?

Hi, this is expected behavior since it’s a limitation of the way the plugin draws particles on screen. I recommend you to read the documentation which explains how you can get some of the functionality back. Here’s the section to save you time:

… For sprites, you can access Dynamic Parameter R and G data from Texture Coordinate with coordinate Index 1 …

(This also means you cannot access rest of the parameters, because of the limited data I can send to the renderer. In case you want to send more data you will need to smartly pack it)

Hopefully this helps. Cheers!

If I create a UMG widget containing this component in Blueprints, it runs normally. However, if I create a UMG widget containing this component in C++, it crashes and displays the following message. I haven’t found a solution yet.

[AssetLog] D:\Program\UE5.7\xxx\Content\Niagara\NS_FX.uasset: Package was saved with a custom version that is not present. Tag C1270362AB230A1FCB1EC73671275FAB Version 1
[AssetLog] D:\Epic\UnrealEngine\UE_5.7\Engine\Plugins\FX\Niagara\Content\ParameterDefinitions\CoreParameters.uasset: VerifyImport: Failed to find script package for import object ‘Package /Script/NiagaraEditor’
Unable to load CoreParameters with outer Package /Niagara/ParameterDefinitions/CoreParameters because its class (NiagaraParameterDefinitions) does not exist
Unable to load RibbonRenderer with outer Package /Niagara/ParameterDefinitions/RibbonRenderer because its class (NiagaraParameterDefinitions) does not exist
[AssetLog] D:\Epic\UnrealEngine\UE_5.7\Engine\Plugins\FX\Niagara\Content\Modules\Update\Color\ScaleColor.uasset: VerifyImport: Failed to find script package for import object ‘Package /Script/DataHierarchyEditor’
Unable to load MeshRenderer with outer Package /Niagara/ParameterDefinitions/MeshRenderer because its class (NiagaraParameterDefinitions) does not exist
Unable to load SpriteRenderer with outer Package /Niagara/ParameterDefinitions/SpriteRenderer because its class (NiagaraParameterDefinitions) does not exist
Oodle Texture loading DLL: oo2tex_win64_2.9.12.dll
appError called: Assertion failed: ModuleManager.IsModuleLoaded(ModuleName) [File:D:\build++UE5\Sync\Engine\Source\Runtime\Core\Public\Modules\ModuleManager.h] [Line: 346]
Tried to get module interface for unloaded module: ‘Niagara’

Hi, from your log it looks like the actual crash is Assertion failed: ModuleManager.IsModuleLoaded(ModuleName) Tried to get module interface for unloaded module: ‘Niagara’, which means you’re calling something that tries to get the Niagara module before it’s loaded. However you didn’t provide a callstack, so I’m not sure what’s exactly calling that.

Please provide a full crash callstack with engine symbols included, exact reproduction steps from a blank project or a sample project with the issue, otherwise there isn’t much I can do. Cheers!

Thank you, I’ve found the root cause of the issue. It’s not a problem with the plugin itself. The crash occurred because the module using this UMG widget is loaded at the PreLoadingScreen stage, during which the Niagara module hasn’t been initialized yet.

Before integrating this plugin, the UMG widget didn’t utilize Niagara, so there were no issues whatsoever. The problem only manifested after adding the plugin, which led me to mistakenly assume it was a compatibility issue caused by the plugin—this diverted my troubleshooting direction.

1 Like