Changelog
0.2.7 - 2026-02-09
Added
ANSamplesLevelActornow hasbShowLevelNameandbShowLogoproperties to control whether the level name and logo are shown.ANSamplesDisplayActortitle settings now hasbShowTitleHorizontalRuleallowing for the title to be drawn with or without a horizontal rule.ANSamplesDisplayActortitle settings now hasTitleTextPaddingallowing for the title to have some padding from the edges.Window > Log > Clean Logs Folderwill remove much of the chaffe in the projects saved/logs folder.NexusPickerdistributions now support finding the nearest point on a NavMesh (V1) via projection mode, withFNPickerUtils::NavQueryExtentcontrolling the distance from the NavMesh volume projectable.FNOrientedBoxPickerfor generating points in a box with rotation.- #120
FNArcPickerfor generating points in an arc distribution.
Changed
NexusDynamicReferencesmodule renamedNexusDynamicRefsavoid unnecessarily long names, this change includes all associated classes and methods.FNSlateUtils::FindSDocTab()a robust search mechanism to find a tab for a widget.UNDeveloperOverlayWidgethas been renamed toUNDeveloperOverlayand moved to theNEXUS: UIplugin.- All
NexusPickerfunctionality has been changed to take variants ofFNPickerParamsstructs to consolidate options; this is a breaking change without any direct upgrade path. NexusBlockoutnow contain simplified collision primitives.
Fixed
- Ensure that a
UNDelayedEditorTaskremoves itself fromUAsyncEditorDelaycomplete event when released. - Added exception for
UDataValidationChangelisttoUNEngineContentValidatoras when submitting with the Revision Control window the changelist object would prevent validation. FNCirclePicker::IsPointInsideOrOnandUNCirclePickerLibrary::IsPointInsideOrOnnow correctly returntruewhen the point is inside a rotated circle.FNBoxPickerandFNRectanglePickerno longer have regions unintentionally excluded in the distribution.ANSamplesLevelActornow properly flags theSM_SkySpherenot to have any collisions, stopping a warning when building NavMesh.
Removed
UNWidgetEditorUtilityWidgetno longer used to wrap content widgets, individuals should extend offUNEditorUtilityWidgetinstead.
0.2.6 - 2026-01-20
Added
Windows > NEXUS > Actor Poolsa tab for monitoring the pressure on theUNActorPoolSubsystemin realtime.FNDeveloperUtils::GetRootSetObjects()/FNDeveloperUtils::DumpRootSetToLog()to help with debugging world tear down issues.FNMultiplayerUtils::GetPing()UNTextRenderComponenticon in editor.UNEditorUtilityWidgetpersistent flag can be used to automatically restore state across map changes (as the widgets are recreated).FNWidgetUtilsto support converting from serialized to slate space.
Changed
- Many enumerations have been modernized to
enum class, leaving only a fewenumwhere necessary. - Console command
NEXUS.ActorPools.TrackStatsrenamed toN.ActorPools.TrackStats. - Extracted test logic from
ANSamplesDisplayActorinto its own test object. UNActorPoolSubsystemnow respectsUnknownBehaviourinUNActorPoolsSettingsto determine what to do when anAActoris returned to the system when aFNActorPooldoes not exist for it.UNTextRenderComponentwill now ensure that its owningAActoronBeginPlayis replicated.
Core Redirects
[CoreRedirects]
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Undefined","Undefined")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Created","Created")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Enabled","Enabled")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Disabled","Disabled")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Destroyed","Destroyed")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_Create","Create")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_CreateLimited","CreateLimited")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_CreateRecycleFirst","CreateRecycleFirst")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_CreateRecycleLast","CreateRecycleLast")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_Fixed","Fixed")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_FixedRecycleFirst","FixedRecycleFirst")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_FixedRecycleLast","FixedRecycleLast")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_None","None")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_SweepBeforeSettingLocation","SweepBeforeSettingLocation")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_ReturnToStorageLocation","ReturnToStorageLocation")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_DeferConstruction","DeferConstruction")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_ShouldFinishSpawning","ShouldFinishSpawning")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_ServerOnly","ServerOnly")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_BroadcastDestroy","BroadcastDestroy")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_SetNetDormancy","SetNetDormancy")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_DefaultSettings","DefaultSettings")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Point","Point")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Radius","Radius")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Sphere","Sphere")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Box","Box")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Spline","Spline")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Disable","Disable")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Warning","Warning")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_WarningButValid","WarningButValid")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Error","Error")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Message","Message")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionType",ValueChanges=(("CJT_TwoWaySocket","TwoWaySocket")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionType",ValueChanges=(("CJT_OneWaySocket","OneWaySocket")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionRequirements",ValueChanges=(("CJR_Required","Required")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionRequirements",ValueChanges=(("CJR_AllowBlocking","AllowBlocking")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionRequirements",ValueChanges=(("CJR_AllowEmpty","AllowEmpty")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellVoxel",ValueChanges=(("CVD_Empty","Empty")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellVoxel",ValueChanges=(("CVD_Occupied","Occupied")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENOrganGenerationTrigger",ValueChanges=(("OGT_GenerateOnLoad","GenerateOnLoad")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENOrganGenerationTrigger",ValueChanges=(("OGT_GenerateOnDemand","GenerateOnDemand")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENOrganGenerationTrigger",ValueChanges=(("OGT_GenerateAtRuntime","GenerateAtRuntime")))
+EnumRedirects=(OldName="/Script/NexusProcGen.EBuildMethod",NewName="/Script/NexusProcGen.ENullBuildMethod")
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleStart",ValueChanges=(("ACLS_BeginPlay","BeginPlay")))
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleStart",ValueChanges=(("ACLS_InitializeComponent","InitializeComponent")))
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleEnd",ValueChanges=(("ACLE_UninitializeComponent","UninitializeComponent")))
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleEnd",ValueChanges=(("ACLE_EndPlay","EndPlay")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_North","North")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthNorthEast","NorthNorthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthEast","NorthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_EastNorthEast","EastNorthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_East","East")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_EastSouthEast","EastSouthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthEast","SouthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthSouthEast","SouthSouthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_South","South")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthSouthWest","SouthSouthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthWest","SouthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_WestSouthWest","WestSouthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_West","West")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_WestNorthWest","WestNorthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthWest","NorthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthNorthWest","NorthNorthWest")))
+EnumRedirects=(OldName="/Script/NexusCoreEditor.ENUpdatesChannel",ValueChanges=(("NUC_GithubRelease","GithubRelease")))
+EnumRedirects=(OldName="/Script/NexusCoreEditor.ENUpdatesChannel",ValueChanges=(("NUC_GithubMain","GithubMain")))
+EnumRedirects=(OldName="/Script/NexusCoreEditor.ENUpdatesChannel",ValueChanges=(("NUC_Custom","Custom")))
0.2.5 - 2026-01-11
Changed
- The
mainbranch of the GitHub repository is now the base point of development; tags are still created for specific release versions, with those points in time being commited to thereleasebranch. - Code cleanup is driven by SonarQube static analysis and suggestions.
- Status check reports for GitHub actions are now marked on individual commits.
Fixed
- Add proper editor menu cleanup for the
NexusFixersplugin.
0.2.4 - 2026-01-06
Added
FNTestUtils::PrePerformanceTest()andFNTestUtils::PostPerformanceTest()for reusable performance testing steps.
Changed
- Update detection now bumps the ignored version to the installed version if it is greater than the saved version.
- Exposed all log categories for external reference.
Fixed
- Accuracy of
FNMethodScopeTimerimproved, as well as fixed TEXT() macro not being closed.
Removed
- Unnecessary TODOs in non-experimental plugins.
0.2.3 - 2025-12-21
Added
- Automatic
UNActorPoolSetloading configurable in projectActor Pool Settings - Glyph based
FNPrimitiveFontsupporting renderingFStringthroughPDI(FNPrimitiveDrawingUtils::DrawString) and other drawing interfaces (FNDrawDebugHelpers::DrawDebugString). - Support for
FNDrawDebugHelpers::DrawDebugStringviaUNDeveloperLibrary::DrawDebugString. UNMultiplayerLibraryexposingFNMultiplayerUtilssupport forPlayerIdentifier.
Changed
- Altered GitHub actions to dispatch tests based on the initial Unit test, as well as fixed up additional warnings thrown by EGS UE.
- Allow adding multiple
UNCellJunctionComponentto a single parent. UNCellJunctionComponentwill now draw indicators for the unit size as well as their actual size.- The
NCellActorwill rename itself to reflect the map name that it creates data for. - The
Is Hostand? Is HostBlueprint methods have had their display names changed toIs Serverand? Is Serverresepectively. N_IMPLEMENT_SETTINGSnow offers aGetMutablenon-const accessor, copyingN_IMPLEMENT_EDITOR_SETTINGS.- Renamed
FNSeedGenerator::SeedFromTexttoFNSeedGenerator::SeedFromString. - Lowered warning level to
Logwhen creating a newFNActorPoolthat already exists in a nestedUNActorPoolSet.
Fixed
- Selecting the
NCellActorno longer adds it to the current selection, instead clearing and making it the sole selected. - Tickable subsystems with conditional ticks now properly respect their conditional tick settings.
Removed
N_LOGandNE_LOGmacros were removed in favor of using the baseUE_LOGmacro, providing better integration IDE's UE tooling.
0.2.2 - 2025-09-24
Added
FNActorPoolSettings::Flagsnow has a defaultedAPF_SetNetDormancyflag.
Changed
- Optimized
FNActorPoolactor creation to quarter the costs in Editor and Development builds. FNActorPool::CreateActornow takes an optional count to support bulk creation.
0.2.1 - 2025-09-23
Added
- Native calls to fill arrays with results of
NMersenneTwistermethods. - Additional blockout shapes for torus' and some larger cuboids.
Changed
- Exposed
FNMethodScopeTimerfor external linking/usage. - Optimized some
NMersenneTwisterdistribution calls. - Explicit
ManualStopoption to bothFNTestScopeTimerandFNTestScopeTimer. - Clarified flags for Actor Pools created during tests.
Removed
- Internal distribution resets in the
NMersenneTwister.
0.2.0 - 2025-09-19
Added
NEngineContentValidatorthrows configurable severity when any content inside theEnginefolder is saved.- VLOG support for all pickers.
- #65 Option to automatically profile multiplayer test clients and standalone server.
- #64 Utilize
DefaultTransformoption onFNActorPoolSettingsas the return location and the scale when spawning. - #63 Add
ServerOnlyflag by default toFNActorPoolSettings. - #62 Added support for nesting
UNActorPoolSet. - #31 Added a watermark option to
NSamplesDisplayActor. - #45 Configurable default
NActorPoolsettings via project settings (Projct Settings > Nexus > Actor Pools). - #47 Add update channel support to the framework.
- Ability to determine if a game is running inside a multiplayer test via both utility and blueprint library methods.
- Support programatically allowing/disallow config files to be staged via
FNEditorUtils::AllowConfigFileForStagingandFNEditorUtils::DisallowConfigFileForStaging. - Add safety check when creating actor pools that we are not getting passed a
nullptr. INActorPoolItemnow has a dynamic multicast delegate (OnActorOperationalStateChanged) that fires when changing states.UNActorPoolLibrarysupporting methods to bind toINActorPoolItemdelegate.- Configurable distribution inner & outer visualizer colors in
Editor Preferences > NEXUS > Core (User) Externaltool section to Unreal defaultTools > Profilemenu withNetworkProfilerwhen present.- Samples content now contains
ANSamplesHUDandANSamplesPawnto support making documentation easier. UNDeveloperSubsystemin non-release builds allowing for monitoring of object counts and providing details.stats NActorPoolscommand to show stats (if tracking enabled).- Manual
AddReference/RemoveReferenceaccess onUNDynamicReferencesSubsystem. - Custom
cpp.hintfile in the plugin folder to mitigate Visual Studio's parser from incorrectly flagging UE macros as not found.
Fixed
ANSamplesDisplayActorno longer causes headless servers to crash.FNActorPoolwill properly time-slice their strategies.FGCScopeGuardguards like a boss during tests now.- Crashes when trying to Pan a non-blueprint editor that uses the blueprint editor (Curves, etc.).
UNActorPoolSpawnerComponentwill properly now allow BP editing of some variables.
Changed
- [#48] Use
HideCategoriesinstead of using a layout customizer pattern. - Corrected a comparison link at bottom of
CHANGELOG. - Renamed
InstanceObjectstoDelayedEditorTasktypes. - Validators now have a combined configuration / strictness level in
Project Settings. - Performance testing framework can now use
GCScopeGaurdwhen doing measured tests. - Properly renamed validators with the N prefix.
SplineLevelReferencewill only be visible whenAPSD_Splineis selected as theDistributiononUNActorPoolSpawnerComponent.- Renamed
bDontDestroyStaticActors/bDontDestroyNonInterfacedActorstobIgnoreStaticActors/bIgnoreNonInterfacedActors. FNActorPoolSettingsnow uses a bitmaskFlagsconfiguration option instead of a long list of boolean flags.- Clarified all
inttoint32to standardize with Unreal platform definitions. - Disabled
Automatically Set Usage in Editorflag onM_NDebug,M_NDebugTextandM_NWireframematerials. - General spelling and grammar fixes to
CHANGELOG.md. - Altered
NSamplesDisplayActorto support replication. Inside or Onabbreviated toIO.- Miscellaneous fixes and tweaks to support rolling out documentation.
- Optimized
FNActorPoolto use a cachedIsStubMode()for clients using a server-only pool. - Moved
Leak Checkduration setting to user level preference. - Clearly defined usage of
FNMetaUtilsstatic methods in helper macros. NEXUS: Material Libraryrenamed toNEXUS: Blockout.- External documentation now supports comma delimited multiple entries.
Removed
bAllowCreateMoreObjectsbecame obsolete onFNActorPoolSettings.- Extra
bRequiresDeferredConstructiononFNActorPool, replaced with a flag.
Core Redirects
+PropertyRedirects=(OldName="/Script/NexusActorPools.NActorPoolSettings.ReturnMoveLocation",NewName="/Script/NexusActorPools.NActorPoolSettings.StorageLocation")
+PackageRedirects=(OldName="/NexusMaterialLibrary/",NewName="/NexusBlockout/MaterialLibrary/",MatchSubstring=true)
Experimental
NEXUS: Developer Consolerenamed toNEXUS: Developer Menustill not functioning stub.NEXUS: ProcGenhas some intial structural work done, but is still not functioanl.
0.1.1 - 2025-08-01
Changed
- Resolves issues with
Shippingbuild configuration (accidental reference toFunctionalTestingmodules inCore). - Resolves issues with
Shippingbuild configuration forNSamplesDisplayActor, in shipping builds the test portions will not function. - Replaced
NTextRenderActorfunctionality withNTextRenderComponentfunctionality.
0.1.0 - 2025-07-31
Added
NActorPoolsGeneralized pooling system for Actors.NCoreFunctionality used by all NEXUS plugins in the framework.NDynamicReferencesMethod for referring to runtime Actors without knowing them.NFixersA collection of tools for fixing content in the Unreal Editor.NMaterialLibraryLibrary of Materials commonly used.NMultiplayerFunctionality and tools that are useful when developing multiplayer games.NPickerSelection functionality for points and other items.NUIComponents for creating a user interface based on UMG/Slate.