Morpheus Platform Release v40.0
See this guide on how to update your existing project to a new editor release.
Version released: 18/05/2026
Morpheus Pawn Actor no longer auto-destroys old pawn on possess
Date of change: 06/01/2026
Affected Projects: all/ODK
Affected Features: Pawn
Does this breaking change need publishing for external users? Yes
What’s broken and why?
Previously, possessing a new pawn via a MorpheusPawnActor, either using PossessOwnedPawn, or via the AutoPossessPlayerOnClientAuthority variable on the class would default to destroying the previously possessed pawn. This was due to an old setup that depended on this, but this assumption can cause confusion now, with actors being removed without explanation.
As a result of this change:
PossessOwnedPawn'sDestroyPreviousPawnfield now defaults to false (previously it defaulted to true)If
AutoPossessPlayerOnClientAuthorityis set to a value other thanDisabled, it will still possess the player, but will not remove the old pawn.
How to fix it?
If you explicitly wanted to delete the old pawn upon possessing the new pawn, you will need to do the following:
If calling
PossessOwnedPawn, you can simply tick theDestroyPreviousPawnfieldIf you were expecting the pawn to be destroyed automatically via
AutoPossessPlayerOnClientAuthority, you will now instead need to destroy the pawn manually.
How to test it?
Check if your logic has any switching of morpheus pawn actors. If not, no work is required. If you are switching between morpheus pawn actors, review the behavior, and make sure that the posessed pawns are still handled as expected.
Minor API changes to MontageComponent
Date of change: 15/12/2025
Affected Projects: all/ODK (the only one now, lol)
Affected Features: Montages
Does this breaking change need publishing for external users? Yes
What’s broken and why?
We have made some changes to the montage component, to make it more user-friendly. This includes enabling the montages in your montage data asset to define the crowd anim sequences without needing them to be provided elsewhere. We have also made some changes that are slightly breaking and worth calling out:
PlayMontageByNameandStopMontagewere called out as “authoritative client only”, but didn’t actually block you from calling them on non-authoritative clients. It now prevents you from doing so, and gives a warning. This means that if you were calling them on other clients (which is not advised), they will no longer play animations. You should instead only control the montage on the authoritative clientThe
OnPlayMontageevent previously also was triggered when stopping a montage, “playing” a null montage. We have instead removed this behavior, soOnPlayMontageis only triggered when playing a new montage. We have instead introduced a separateOnStopMontagethat is triggered when a montage is stopped, providing details of the stopped montage.
How to test it?
Play your game. If you see the following, you should investigate the breaking changes:
Looping montages - likely due to not listening to
OnStopMontageMontages not playing on non-auth clients - likely due to incorrectly triggering
PlayMontageByNameon the non-auth client
Move custom packed struct from Action Gameplay Helper API into HitInfo Structs
Date of change: 12/12/2025
Affected Projects: All
Affected Features: Action Gameplay Helper API
Does this breaking change need publishing for external users? Yes
What’s broken and why?
APIs in the Shootable and Combat component that passed in a Morpheus packed struct as custom data have been changed. The custom data param has been removed, and moved into the HitInfo struct.
How to fix it?
Change Blueprint logic to pass the custom data into the struct instead.
Removed legacy capability gameplay tags (not committed yet)
Date of change: 03/12/2025
Affected Projects: All
Affected Features: Capability gameplay tags
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The default DT_M2_GameplayTags asset contained many legacy gameplay tags which are no longer used in the Morpheus platform, and have now been removed. If your project uses any content from the M2Deprecated plugin, or uses any of the Capability tags directly, you may need to re-add the removed tags.
How to fix it?
Download the standalone M2Deprecated plugin and add the DT_M2_DeprecatedGameplayTags asset to your project. This is a copy of the previous version of DT_M2_GameplayTags containing all the legacy tags.
In the GameplayTags section of the project settings, replace the DT_M2_GameplayTags entry with DT_M2_DeprecatedGameplayTags to restore the previous tags. Alternatively you can manually add the ones your require as a new asset, as detailed here: Adding Gameplay Tags | MSquared Docs
How to test it?
All previous gameplay tags will be available in the gameplay tag UI.
Removed input configs
Date of change: 03/12/2025
Affected Projects: All
Affected Features: Input
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The input mappings in the base engine are entirely unused now by the Morpheus Platform, so have been removed. If you have not made changes to the input mappings in your own project, but depend on them (e.g. if you’re referring to M2Deprecated content), the actions will stop working, and you will see warnings about the input actions being missing.
How to fix it?
If you depend on these old input actions, you can add them manually to your project.
In your project’s
Configfolder, find or create aDefaultInput.iniIn your ini file’s
[/Script/Engine.InputSettings]section (add one if it is not present), add the removed config values:Private & Shared/Engine/Internal Workflows/MSquared breaking changes/input_mappings.txt
Feel free to review and/or remove any you no longer need
(If you already have values in this section, best to paste these values above the existing ones, to avoid your changes being stomped)
Close your editor and reopen it
The input mappings should now be visible in your
Project Settings -> Input
How to test it?
Play your game - it should respond to inputs as expected, and not give warnings about missing inputs
Removed MetricsManager default singleton and code class
Date of change: 01/12/2025
Affected Projects: All
Affected Features: Default singletons
Does this breaking change need publishing for external users? Yes
What’s broken and why?
BPM_MetricsManager and the base code class JM_MetricsManager have been removed. The J_MetricsSubsystem:: GetMetricsManager function has also been removed. MetricsManagerClass has been removed from the list in the World Settings.
The metrics manager class didn’t add any functionality, but it was possible to subclass it in a project and use the default singletons entry to spawn it.
How to fix it?
If you have subclassed JM_MetricsManager then simply reparent it to MorpheusActor. If your subclass was spawned by being set as the MetricsManagerClass in the singletons list, you can explicitly add it in the Additional Singletons array in the singletons settings. Calls to GetMetricsManager can be replaced with GetActorOfClass.
How to test it?
You blueprint should be spawned and function as before.
M2Extras_PubnubChat example integration moved to M2Deprecated
Date of change: 25/11/2025
Affected Projects: All
Affected Features: PubNub chat
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The M2Extras_PubnubChat plugin contained a blueprint example of integrating Pubnub chat into a project. As this is no longer being actively tested or maintained, the existing example content has been moved into the M2Deprecated plugin which is available to download separately.
How to fix it?
If your project is directly using any of the content in the M2Extras_PubnubChat plugin, the simplest solution is to copy those assets into your project before upgrading.
Alternatively, download the separate M2Deprecated plugin and copy it into your project’s Plugins directory - you blueprints should automatically reference the deprecated assets in the M2Deprecated plugin.
See the Morpheus Platform v39 documentation for details on integrating this example content. However, note that this documentation is no longer officially supported and may be out of date.
How to test it?
Pubnub chat continues to work in your project.
‘Soft’ deprecation of legacy systems
Date of change: Ongoing
Affected Projects: All
Affected Features: Various
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The Morpheus platform contains legacy features that may be in use by projects, but which are overly opinionated and could be implemented more flexibly directly in the project. Deprecating them in Unreal itself causes warnings in the Blueprints which is not desirable for projects, so instead they are being ‘soft’ deprecated. The approach is to add a display name for the class or function with a _DEPRECATED suffix. This doesn’t affect the functionality in any way and the system will continue to work.
There is no timeline for fully deprecating the functionality, these systems will not be prioritised for further support and should be avoided. If you are using any, consider moving towards a project-side implementation.
The affected systems are:
J_CharacterBaseandJM_CharacterBase. UseM2_CharacterBaseandM2M_CharacterBasedirectly instead.JunoCoreUI:J_BaseHUD,M2_CoreWidget,M2_StandardButton,J_UISkinsSubsystemand related. Use the vanilla Unreal HUD and standard widgets.Morpheus Chat system:
JM_ChatServer,MorpheusChatSenderComponent,MorpheusChatReceiverComponentand related. SeeBPMC_M2Example_TextChatComponentfor an example of a blueprint replacement.JM_PlayerProfileComponent: useM2M_PlayerProfileComponentdirectlyJ_PlayerController: use the vanillaPlayerControllerdirectlyM2_EnhancedInputSubsystemandM2_InputPrioritizationSubsystem: use the vanilla Unreal input systemsJM_WorldTravelPortal: useM2_WorldTravelServicedirectlyM2M_HealthComponent: seeBMPC_CombatExample_Healthfor an example blueprint implementationTutorials (
M2_TutorialManagerActorComponentand related)Effect applicator (
JM_EffectManagerand related)Inventory and Equipment (
JM_InventoryComponent,JM_EquipmentComponentand related)J_NameplateComponentM2_NavigationPoolingSubsystemM2M_WeatherControlInteraction and FocusCam (
M2_FocusCameraComponent,M2_InteractableComponentand related)Legacy Roles system (
JM_RolesComponent)
How to fix it?
Nothing needs fixing as a result of this change, however it is recommended to migrate away from any soft-deprecated systems.
How to test it?
Systems work as previously.
Removed some default singletons
Date of change: 02/12/2025
Affected Projects: All
Affected Features: Default singletons
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The Morpheus Platform - Singletons section of the World Settings contained many non-critical singletons, and singletons used by deprecated systems, that have now been removed from the list. These optional singletons can now be added as required, instead of being added to all maps.
The removed default singletons are:
AbilitySingletonClass: default wasJM_AbilitySingleton(used by deprecated ability system)NotificationsSingletonClass: default wasM2M_NotificationsSingleton(required if using the Notifications system)ConsoleCommandSingletonClass: default wasJM_ConsoleCommandsSingleton(adds a debug command)LatencyInspectorSingletonClass: default wasBPM_LatencyInspectorSingleton(adds a rebug command for measuring latency)MetricsManagerClass: no longer requiredCapabilitiesManagerClass: default wasBPM_CapabilitiesManager. This will need re-adding if you:Selectively enable emotes per-role in
JM_PlayerEmotesComponentwith a role capabilityUse
JM_CharacterBaseto enable voice chat functionality, or to force specific players into the foregroundUse
JM_ObserverCameraManagerto enable load/save camera functionality with theObserverSaveLoadCapabilityon the roleUse
J_PlayerCameraManagerto enable observer mode with theObserverAccessCapabilityon the roleAccess the manager directly with
J_CapabilitiesSubsystem::GetCapabilitiesManager
How to fix it?
If you still want to spawn any of these singletons, add them to the Additional Singletons array in the Morpheus Platform - Singletons section of the world settings.
How to test it?
Verify the required singletons are still spawned.
JunoGameData references replaced by LiveConfig
Date of change: 25/11/2025
Affected Projects: All
Affected Features: LiveConfig
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The legacy JunoGameData.* console commands have been removed in favour of the equivalent M2.LiveConfig.* commands. The new commands behave identically, only the prefix has changed.
Also in the Blueprint editor you can no longer use the keywords Game Data Attribute to search for live config nodes. Search directly for Live Config instead.
How to fix it?
Use the M2.LiveConfig.* console commands instead of JunoGameData.*, and use Live Config to find nodes in editor.
How to test it?
Console commands work as before.
Moved JunoGenericLighting and JunoCore maps to M2Deprecated
Date of change: 24/11/2025
Affected Projects: All
Affected Features: Maps
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The JunoGenericLighting and JunoCore maps have been moved into the M2Deprecated plugin, which is available to download separately. These maps just contained a default lighting setup, and some bot config. These actors have been copied directly in the affected maps in the platform for simplicity.
How to fix it?
If you’re using either of these maps, the simplest solution is to copy the actors from these maps directly into your own maps before upgrading. Alternatively, download the separate M2Deprecated plugin and copy it into your project’s Plugins directory - you maps should automatically reference the deprecated maps in the M2Deprecated plugin.
How to test it?
All actors are present in your maps.
Renamed Mac device Profiles
Date of change: 21/11/2025
Affected Projects: Projects who have custom device profile overrides defined in ConsoleVariables.ini.
Affected Features: Graphics Settings / Device Profiles
Does this breaking change need publishing for external users? Yes
What’s broken and why?
Renamed profile MacClient_Macbook to MacClient_LowSpec
Renamed profile MacClient_StudioUltra to MacClient_HighSpec
How to fix it?
Replace any instances of MacClient_Macbook or MacClient_StudioUltra defined in ConsoleVariables.ini with the either MacClient_LowSpec or MacClient_HighSpec, respectively.
How to test it?
Load game on a mac device and verify any profile overrides have been set correctly.
Removal of M2M_PartyComponent and M2M_PartyManager
Date of change: 24/11/2025
Affected Projects: All
Affected Features: Activities
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The Party system has been marked as deprecated since v38, so has now been fully removed.
How to fix it?
If your project uses Parties, please remove or replace the use of the code classes before updating to this version. Projects will then need to implement their own functionality in project space if required.
How to test it?
Blueprints compile without error.
Removal of Activities system
Date of change: 24/11/2025
Affected Projects: All
Affected Features: Activities
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The Activities system has been marked as deprecated since v36, so has now been fully removed.
How to fix it?
If your project uses Activites, please remove or replace the use of the code classes before updating to this version. Projects will then need to implement their own functionality in project space if required.
How to test it?
Blueprints compile without error.
RaycastableCrowd has been replaced with DynamicColliderProxySystem
Date of change: 14/11/2025
Affected Projects: All
Affected Features: Raycastable Crowd
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The RaycastableCrowd has been replaced with a system with similar functionality, the DynamicColliderProxySystem. The crowd collider implementation of this is the MorpheusActorColliderProxySystem.
All raycastable crowd related classes and settings have been removed.
How to fix it?
You will need to set up the MorpheusActorColliderProxySystem in your game to match the functionality. Please see the full docs, but for a quick conversion to the new system:
There’s no longer a RaycastableCrowd class that you need to specify with the settings of the raycastable crowd. Instead, you configure these settings in the WorldSettings.
BP_M2_AvatarColliderProxyActoris the replacement forBP_M2_AvatarRaycastableCrowdActor.To configure the prioritization settings that used to be in the RaycastableActor class, you now need to create a PrioritizationSettings class with your settings in, and specify it in Prioritization Settings Class in WorldSettings.
How to test it?
Go into a level with crowd members (using the live config game.PlayerClient.Rendering.NumInLOD0 to decrease the number of non-crowd members if necessary) and see if the correct crowd members have colliders, matching what your project was previously set up with. You can enable bDebugVisibility on the BP_M2_AvatarColliderProxyActor to help with this, or use the Unreal command show COLLISION .
Remove JM_StateSequenceComponent
Date of change: 13/11/2025
Affected Projects: All
Affected Features: JM_StateSequenceComponent
Does this breaking change need publishing for external users? Yes
What’s broken and why?
JM_StateSequenceComponent has been removed as it’s not a core part of the platform, and can easily be built in a project Blueprint.
How to fix it?
Functionality will need to be rebuilt a project blueprint. It’s an array of {FromStateName, ToStateName, ULevelSequence}, and a replicated ToStateName. When receiving a new ToStateName, the corresponding level sequence between the old and new state is played.
How to test it?
The project behaves as previously.
WebUI respects the URL allow list
Date of change: 06/11/2025
Affected Projects: All
Affected Features: WebUI
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The M2 platform allows configuring external URL access policies, to enable projects to restrict access to unauthorised domains. This policy now also applies to the WebUI in-game browser.
Loading local files now requires the Allow All policy, to avoid exploits that bypass loading from a URL.
How to fix it?
Check the External URLs section of the your project’s admin dashboard. If you have filtering enabled, add any required domains to the allow list. If you’re using WebUI to show local files, you must change the policy to Allow All.
How to test it?
The web browser will still be able to open the page. If a request is blocked you will see a log message LoadURL: Requested URL is denied by policy.
M2Deprecated, JunoSkypark and JunoVoxelWorld plugins removed
Date of change: 06/11/2025
Affected Projects: All
Affected Features: All deprecated content
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The M2Deprecated plugin has now been removed from the platform by default, but is available to download as a separate plugin that can be re-added to your project. The deprecated content is no longer maintained, so has been removed to simplify the platform for new users.
Some of the blueprints in the separate M2Deprecated plugin relied on code that has also been removed. These blueprints have been fixed up to remove compile errors, but may not function as before. You can refer to the blueprints in the v39 editor release to see the original implementations.
JunoSkypark content has also been removed. These were mostly redirectors, and replacement core redirects are included in the downloadable M2Deprecated plugin. Follow the steps below if you encounter and issues with JunoSkypark references.
JunoSkypark has also contained a handful of code classes that have been removed. J_GraffitiWallFunctionLibrary for the removed graffiti wall functionality, J_Skypark_LightSource which updated intensity based on an MPC and can be re-implemented in blueprint, and JM_RepulsorArea which was used by the deprecated activity system.
JunoVoxelWorld was an unsupported experimental plugin and has been removed entirely.
How to fix it?
Access the M2Deprecated plugin via the plugins tab within the ODK Launcher. Drop the M2Deprecated plugin into your project, in <ProjectRoot>/Plugins/. It is now part of your own project, and you have full control over it.
The M2Deprecated plugin also contains core redirects for all of the redirector assets removed in the platform, so all existing asset references should continue to work. It’s recommended to resave every asset in your project, which will fix up the references.
How to test it?
Your project should compile and run as before, with no errors caused by missing assets.
Changes to the BPC_M2Example_NameplateComponent
BPC_M2Example_NameplateComponentDate of change: 06/11/2025
Affected Projects: All
Affected Features: Nameplates
Does this breaking change need publishing for external users? Yes
What’s broken and why?
We have extended the functionality in BPC_M2Example_NameplateComponent to support globally disabling nameplates, as well as each individual nameplate hiding due to distance etc. (Details in Nameplates | MSquared Docs)
For this reason, there are two changes to the component’s functionality to note:
SetWidgetEnabledhas been renamed toSetIndividualWidgetEnaabled, to reflect that this only refers to the distance etc. checks, and not whether it is actually enabled, which could be due to nameplates being disabled globallyIsEnabledchecks whether the nameplate should ultimately be visible or not, handling both the individual check, and the new global check
How to fix it?
No changes needed - the function rename should apply globally
DefaultIconMap setup in deprecated UI skinning system
Date of change: 05/11/2025
Affected Projects: All
Affected Features: UI skinning icons
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The default value for J_InputIconConfig::DefaultIconMap was an asset in the M2Deprecated plugin, which has now been removed (but can be downloaded separately). Because of this, the default value has been removed from the platform. If your project relied on the default /M2Deprecated/M2Content/UI/Input/DA_InputIconMap asset you will need to manually re-add this in a config file.
If you don’t use the skinning system, or the icon map, then no action is necessary.
How to fix it?
Add the DefaultIconMap to the [/Script/JunoCoreUI.J_InputIconConfig] section in your <ProjectRoot>/Config/DefaultGame.ini file, or add the section if it doesn’t exist:
[/Script/JunoCoreUI.J_InputIconConfig] DefaultIconMap=/M2Deprecated/M2Content/UI/Input/DA_InputIconMap.DA_InputIconMap
(This assumes you’ve downloaded the legacy M2Deprecated plugin and copied it directly into your project - the asset may be at a different the path if not.)
How to test it?
The UI skinning and icons will behave the same as before.
Client origin API changes
Date of change: 20/10/2025
Affected Projects: All
Affected Features: Client Origin
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The methods to change the client origin, used for net prioritisation, have changed. This includes:
PushClientOriginActorRemoveClientOriginActorClientOriginMovement
Net prioritisation now takes into account all client origin actors that are in the ClientOriginLocations set (see below). This no longer operates as a queue that you can push/remove from; you’ll need to directly clear the set if you want to change which actor is used as the client origin.
How to fix it?
Use:
AddClientOriginActorRemoveClientOriginActorSetClientOriginActorsSetClientOriginActorGetClientOriginActors
To directly set which actors you want to be used for net prioritisation at any given time.
How to test it?
Check that the correct actors are in your foreground, midground and background after you’ve made the changes above.
UserCollections, Wallets, Currency, Transactions and Purchaseables systems removed
Date of change: 20/10/2025
Affected Projects:
Affected Features: UserCollections, Wallets, Currency, Transactions and Purchaseables systems
Does this breaking change need publishing for external users? Yes
What’s broken and why?
These systems have been deprecated in M2 for several releases, and relied on the User Collections web platform system which has been removed. As these systems are now non-functional they have been removed entirely.
How to fix it?
Projects should already have migrated away from these systems. Currency and transactions should be implemented in project space.
How to test it?
Blueprints compile without error.
Removal of StorePlayerProfile async task
Date of change: 17/10/2025
Affected Projects: All
Affected Features: Player Profile system
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The StorePlayerProfile async task node has been removed. This didn’t support saving the player avatar, and you can just call the underlying functions directly.
How to fix it?
Replace with calls to the Save functions on the M2_WebServivesDataProvider (see BP_M2_ProfileDataProvider for examples). It’s also possible to use the M2_PlayerProfileSubsystem.
How to test it?
The project should compile and profile name/avatar data should save correctly.
Removal of profile pictures and legacy content from M2 player profiles
Date of change: 17/10/2025
Affected Projects: All
Affected Features: Player Profile system
Does this breaking change need publishing for external users? Yes
What’s broken and why?
M2_PlayerProfile now only contains a Name and AvatarUrl. It no longer contains legacy properties for Profile Images, Wallet, and User Collection items associated with your avatar. These have been previously deprecated, and it wasn’t possible to save new values to a user’s profile for these.
JM_PlayerEmoteComponent no longer supports J_ProfileAsEmotePrimaryAsset as profile images are no longer a core part of the M2 player profile. Profile picture emotes can be implemented in the project instead.
Functions and delegates related to profile images and user collections have been removed from M2_PlayerProfileSubsystem, M2_WebPlatformUserProfileService and M2M_CharacterAssetComponent. It was already impossible to update these values, so the API has now been removed.
M2M_PlayerProfileComponent no longer replicates a profile image. This can be implemented in the project instead.
How to fix it?
Use the M2_PlayerProfile::AvatarUrl property directly to retrieve the avatar, instead of using the Url property in the Avatar structure:
Remove any live config overrides for Profile.DefaultProfileUrl and Profile.ProfileAsEmoteEnabled
Profile pictures can be implemented in the project if required, by storing them in the KV Store with your own key. See BP_M2_ProfileDataProvider for an example - it would work the same as storing and loading the avatar URL:
Profile picture emotes will need implementing in the project. One method would be add a replicated image URL to each player, and showing a custom widget above a player when they trigger an emote.
How to test it?
The project compiles without errors, and no live config errors are present when playing in editor.
Player Profile changes
Date of change: 15/10/2025
Affected Projects: All
Affected Features: Player Profile system
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The default player profile implementation in BP_M2_ProfileDataProvider has been migrated to storing date in the M2 KVStore, and requires the MP_M2_KVStoreService to exist. This replaces the legacy profile API.
How to fix it?
The service should be enabled by default. If you’ve changed the KV Store Service Class in your world settings then you will need to also use your own Profile Data Provider Class. You can take a copy of BP_M2_ProfileDataProvider and update its uses of MP_M2_KVStoreService to use your own service.
How to test it?
Profile data (display name and avatar URL) should be retrieved correctly when loading into a world.
KVStore Store delegate signature has changed
Date of change: 15/10/2025
Affected Projects: All
Affected Features: KVStore
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The completion delegate passed into M2_KVStoreService::Store has a different signature. Previously it took a single Success bool, but now it takes a struct containing the same Success value plus the ID of the request triggered it (which is now passed back from Store function). This enables you to associate a response with a specific request.
How to fix it?
For delegate events, you should just need to break the new Result pin to get Success.
For delegate functions, update the signature to to take a FM2_KVStoreServiceStoreResponse instead of a bool, and split that to get Success.
How to test it?
Blueprints should compile and behave the same.
Removal of M2 AvatarEditor code and assets
Date of change: 13/10/2025
Affected Projects: All
Affected Features: Avatar Editor
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The deprecated M2 Avatar Editor C++ classes and blueprints have been removed, as they relied on legacy Web Platform features that are no longer available.
How to fix it?
Remove any references to M2_AvatarEditorActor, M2_AvatarEditorComponent and any of the /M2Deprecated/AvatarEditor assets from your project.
Remove any live config overrides for AvatarEditor.* values from your project’s game.override.json file, otherwise live config setup will fail with an error.
How to test it?
The project compiles and runs without errors.
Removed the BA Welcome Screen by default
Date of change: 14/10/2025
Affected Projects: All
Affected Features: BlueprintAssist
Does this breaking change need publishing for external users? Yes
What’s broken and why?
We have now hidden the “BA Welcome Screen” popup from new projects, created via our starter project template.
How to fix it?
If you want information on how to use the Blueprint Assist plugin, please look into it independently.
If you want the the popup to display for your project, you can add the following section to your DefaultEditorPerProjectUserSettings.ini:
[/Script/BlueprintAssist.BASettings_EditorFeatures] bShowWelcomeScreenOnLaunch=False
Removed the EUW_RolesHierarchyViewer utility widget
EUW_RolesHierarchyViewer utility widgetDate of change: 26/09/2025
Affected Projects: All
Affected Features: Roles
Does this breaking change need publishing for external users? Yes
What’s broken and why?
We have removed the EUW_RolesHierarchyViewer utility widget, and its dependent widgets, since it was noticed that this has been broken for about a year, and was only ever used for now-deprecated content. Since it has gone unnoticed for a year, we have chosen to remove it rather than fix it and keep it in deprecated content.
How to fix it?
N/A
How to test it?
N/A
CrowdScale functionality removed from M2M CharacterBase
Date of change: 23/09/2025
Affected Projects: All
Affected Features: Character
Does this breaking change need publishing for external users? Yes
What’s broken and why?
Set/GetCrowdScale have been removed from M2M CharacterBase. This functionality is superceded by MorpheusAnimatedSkeletonComponent’s relative transform functionality.
The EnableResizingOfAnimatedCrowd LiveConfig has also been removed.
Resizing functionality in the deprecated AJM_CharacterBase (with JM_ReiszeableActorComponent) class is now broken.
How to fix it?
In any case where you would have set the crowd scale to match the lod0 actor’s scale, you can use Character.MorpheusAnimatedSkeletonComponent.SetSkeletalMeshRelativeTransform and set the scale property of the transform. This will affect the lod0 and crowd transform, so you don’t need to branch.
If you want to intentionally set the crowd scale of an actor to be different to the lod0 scale of an actor, then you’ll need to implement your own IMorpheusAnimatedSkeleton::ApplySkeletalMeshTransform in your character class. See the MorpheusAnimatedSkeletonComponent in the docs for details.
If you were using the deprecated AJM_CharacterBase class, you should swap to using AM2_CharacterBase and the BPMC_M2Example_ResizingComponent to continue using resizing functionality in the crowd.
How to test it?
Check your characters and resizing correctly in the crowd.
Graphics Settings reduce maximum visible Carnival Meshes (MML)
Date of change: 22/09/2025
Affected Projects: All
Affected Features: Carnival Rendering
Does this breaking change need publishing for external users? Yes
What’s broken and why?
To aid in client performance, the maximum visible Carnival meshes have been limited based on the graphics settings used. No change is required by the Project. Can be overridden by project settings if desired.
Graphics Settings
Max Carnival Meshes
Low
2500
Medium
8750
High
15000
Epic
15000
How to fix it?
Override r.Carnival.MaxVisibleModels in projects settings following this documentation Editing Project Settings | MSquared Docs
Replicated animations and capsule moved into components
Date of change: 15/09/2025
Affected Projects: All
Affected Features: Characters
Does this breaking change need publishing for external users? Yes
What’s broken and why?
Functionality related to the replicated animated skeleton now exists in M2_AnimatedModularCharacterComponent (e.g. the skeletal mesh transform applied to the crowd).
Functionality related to the replicated capsule now exists in M2_ReplicatedCapsuleComponent.
Additionally, all actors that implement IMorpheusPooledActor will automatically be hidden, collision disabled, and tick disabled when they enter the pool, and the inverse when they return from the pool, so long as the parent MorpheusPooledActor implementation is called. There is no need to perform these actions manually now.
How to fix it?
Instead of the skeletal mesh transform and capsule component data existing in your character class directly, these now exist in Character.AnimatedModularCharacterComponent and Character.ReplicatedCapsuleComponent. You’ll need to update these references.
How to test it?
Project should build and characters should function as normal.
Deprecate M2_WebSocketConnection
Date of change: 15/09/2025
Affected Projects: All
Affected Features: WebSockets
Does this breaking change need publishing for external users? Yes
What’s broken and why?
We have deprecated M2_WebSocketConnection in favour of two alternatives: M2_JsonWebSocketConnection and M2_StringWebSocketConnection. The class had previously been deprecated, but not in a way that was communicated to downstream users.
As a result of this, the Connect node of the old M2_WebSocketConnection class will now result in warnings, and you will not be able to add further calls.
How to fix it?
Switch to using whichever out of M2_JsonWebSocketConnection and M2_StringWebSocketConnection is more appropriate for your use case. For instruction on how to use them, see WebSockets | MSquared Docs
How to test it?
Your logic compiles as normal with no warnings. If you needed to modify your logic, check your websockets still connect and send messages as expected.
Deprecated the use of Pawn Sets
Date of change: 09/09/2025
Affected Projects: all
Affected Features: Animated Crowd
Does this breaking change need publishing for external users? Yes
What’s broken and why?
#1:
Pawn sets are no longer required to define a morpheus actor’s render target actor or crowd. Instead, if you have a render target actor defined in the details panel, it will be used, and if crowd is enabled, its details will be inferred automatically from the render target actor.
(Documentation on this process will be written soon)
There are two breaking changes that will need to be noted as a result of this:
BPM_M2Example_PlayerCharacterno longer callsApplyPawnSet. If your character extends this class and relies on a specific pawn set, this logic will need to be re-added, or handled without using pawn setsInstead of defining the montages known by the crowd in the pawn set’s Crowd Data Asset, we can provide the list in our actor class (see
GetAnimNameToSequenceMap). This has been done already inBP_M2Example_PlayerCharacter.If your morpheus actor extends
BPM_M2Example_PlayerCharacter, but your character does not extendBP_M2Example_PlayerCharacter, or you have added additional montages than the list existing inDA_SkeletalCrowdData_LoD1, you will need to override this function and provide the mappings you need (or the character will be unable to emote in the crowd)
#2:
Since pawn sets are no longer required, we have now deprecated all the pawn sets except for DA_Pawns (which is still our default pawn set), moving them into M2Deprecated. If you reference any of these assets in your project, you will need to enable the M2Deprecated plugin to access them, and move them into your project.
DA_Origin_Pawns_ApproachabilityDA_Pawns_AudioMixerDA_Pawns_ObserverDA_Pawns_ObserverDirectorDA_Presenter
#3:
Since we no longer call ApplyPawnSet to initialize your character (for classes extending BPM_M2Example_PlayerCharacter), it it possible for the render target actor to be spawned earlier in the process. If you e.g. listened to OnRenderTargetUpdated, and didn’t also check the current render target, the callback may not trigger, if bound after the initial render target was already set.
How to test it?
Easiest way to verify that it is working as expected would be:
PIE with 2 clients, and
PlayerClient.Rendering.NumInLOD0set to 0. That way the other client you are looking at will be a crowd memberWalk around - both characters should appear and animate as expected
Emote - the crowd member should animate when emoting.
If you have a presenter or observer role in your project, check that you can still switch to it correctly.
Remove M2_ExampleAudioProcessor and its LiveConfig value VoiceChat.ExampleProcessorEnabled
VoiceChat.ExampleProcessorEnabled Date of change: 02/09/2025
Affected Projects: All
Affected Features: Crowd Audio
Does this breaking change need publishing for external users? Yes
What’s broken and why?
Removed the M2_ExampleAudioProcessor as it was always disabled and even if it was enabled it was doing nothing. It was also causing a crash as a result of accessing live config (not thread-safe) from the crowd audio thread.
This also resulted in removing the already deprecated live config value VoiceChat.ExampleProcessorEnabled from the game config
How to fix it?
Ensure that you aren’t relying on the live config value VoiceChat.ExampleProcessorEnabled and if so, you can add a new live config value for your specific usage.
How to test it?
Crowd audio is working as expected.
Undefined anim vars now default to 0/false
Date of change: 01/09/2025
Affected Projects: All
Affected Features: Animation
Does this breaking change need publishing for external users? Yes
What’s broken and why?
We have now provided explicit behavior to an edge case that previously resulted in undefined behavior:
If you define a variable in your animation blueprint which is not actually registered in your anim vars component - previously this would result in an undefined result (i.e. if you use a IsDead bool, but don’t register it in your anim vars component, the result could either be true or false). Now, it will always fall back to 0 (false for bools).
If you had unregistered variables previously, it could be that they were defaulting to the right value accidentally, in which case this change may result in their behavior changing. If so, you would see errors along the lines of:
LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name IsSprinting, but this could not be found. Please check your anim var names. LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name InCombatMode, but this could not be found. Please check your anim var names.
How to fix it?
If you are seeing the above warnings, you should address them. See Custom Animation Variables | MSquared Docs for details on how to register custom anim variables.
How to test it?
When you play the game with crowd members (easiest way would be to set the PlayerClient.Rendering.NumInLOD0 override to 0 and test with a second client), you shouldn’t see any warnings along the lines of:
LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name IsSprinting, but this could not be found. Please check your anim var names. LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name InCombatMode, but this could not be found. Please check your anim var names.
If you do, please verify whether these variables are needed in your ABP, or need to be registered in your anim vars component.
Introduced min LOD checks for projects targeting mobile platforms
Date of change: 25/08/2025
Affected Projects: Only projects targeting mobile devices, e.g. IOS/Android
Affected Features: Cooking
Does this breaking change need publishing for external users? Yes
What’s broken and why?
To help avoid performance issues on projects targeting mobile platforms, we have added some automated checks and logic to enforce that skeletal meshes and static meshes have sufficient LODs.
If you attempt to cook for a project that targets Android or IOS, and has fewer LODs than the configured minimum (in Project Settings | M2 World Builder - 7 for skeletal meshes, 4 for static meshes), it will be flagged as an error. If you are cooking from the editor, a popup will show for each flagged asset.
For more details on this, see Automatic Mesh Validation | MSquared Docs
How to fix it?
The ideal solution would be that if you have any such meshes that need fixing up, that you address them. Any meshes that were flagged when you attempt to cook should be looked at. You can either manually add LOD levels, or alternatively, if you save the asset, it will automatically generate the required number of LODs for you.
If you aren’t intending to build for mobile platforms, you can modify your “supported platforms” list. This can be done in your
.uprojectfile. AnyIOSorAndroidones can be removed.If you don’t want the checks to be applied, you can turn them off by going to
Project Settings | M2 World Builder | Mesh Validation, and un-checkingValidateMeshes.
How to test it?
Attempt to cook your project. Cooks should succeed for your target platform.
Removed MorpheusConnection OnMorpheusActorCheckedOutBP Implementable Event
Date of change: 21/08/2025
Affected Projects: All, although unlikely to could’ve been used by downstream projects
Affected Features: MorpheusConnection delegates
Does this breaking change need publishing for external users? Yes
What’s broken and why?
The BP implementable event OnMorpheusActorCheckedOutBP on the MorpheusConnection has been replaced with a Blueprint Assignable Delegate OnMorpheusActorAdded and OnMorpheusActorRemoved
How to fix it?
Instead of using OnMorpheusActorChecekdOutBP you can now assign to the delegate OnMorpheusActorAdded
How to test it?
Ensure that the OnMorpheusActorAdded delegate is being called when MorpheusActors spawn in the world.
Deprecating J_CharacterMovementComponent and JM_AnimVarsComponent
The following is a significant breaking change in upgrading to release v39. If you are using the simplified base classes (i.e. not the deprecated classes with e.g. the Origin or J_ prefixes), you will be affected, and will need to take action.
If you have extended the deprecated classes, and are using your own anim instance (ABP), you will likely also be affected (see Modified ABP_M2_Human). In that case, you will need to make sure your ABP is correctly reflected in your crowd, explained in the If you want to keep using the deprecated classes (only recommended as a temporary solution) section
Does this affect me?
Have a look through the What's changed, and why? section. Some sections may not be relevant to your project; if so, feel free to skip them.
If your character extends e.g. M2_CharacterBase, BP_M2_PlayerCharacter or BP_M2Example_PlayerCharacter, you will be affected at least by the change to the character movement component, even if you are not using any of the deprecated functionality. You will see the following popup when you open your character class. More details on this in Resolving the corrupted CharacterMovementComponent.

If any of these parts are relevant to your project, see How to fix.
What's changed, and why?
The following changes have been made to the M2 character and morpheus actor (M2_CharacterBase and M2M_CharacterBase), meaning that if you are using blueprints based off of those classes, you will be impacted. If you are still using the deprecated character (extending e.g. J_ classes or Origin classes), you will not be affected by this.
Deprecated Anim Vars Component
The existing JM_AnimVarsComponent has now been deprecated, in favour of a stripped back M2M_AnimVarsComponent.
The following anim vars have been removed:
IsWalkingIsDoubleJumpingHasBeenLaunchedHasLowGravityHasZeroGravityIsMovingInLowGravityIsThrustingUpIsThrustingDownIsBouncingIsSlidingIsAiming
The following anim vars have been modified: (These have been moved into being custom anim vars. For more details, see Changes to gait speeds& Changes to "combat mode")
IsJoggingIsSprintingIsInCombatModeIsDead
In the deprecated J_AnimInstance, these are still accessible via the DeprecatedAnimVars variable
Modified ABP_M2_Human
ABP_M2_Human, our default anim instance, has been reparented from J_AnimInstance to M2_AnimInstance, and so no longer uses the deprecated anim vars. The old anim vars are still in use in the deprecated ABP_M2_Human_OId.
Deprecated Character Movement Component
The existing J_CharacterMovementComponent has now been deprecated, in favour of using the native default CharacterMovementComponent.
The following features have been removed:
The “Custom Movement Mode Primary Asset” system (see Changes to "custom movement")
Some minor helper functions, like
AddGravityMultiplierandAddGaitSpeedMultiplierThese could easily be added in the blueprint level in downstream projects if desired.
The following features have been modified:
“Gait speeds” (see Changes to gait speeds)
“Combat mode” (see Changes to "combat mode")
Due to
M2_CharacterBase'sCharacter Movementclass being changed (fromJ_CharacterMovementComponenttoCharacterMovementComponent), unfortunately assets extendingM2_CharacterBasewill have their component corrupted. If this affects your character, you will see the following popup when attempting to play or open your asset.For resolving this, see Resolving the corrupted CharacterMovementComponent

Changes to gait speeds
Gait speeds” are now no longer used as a core concept, and the BPC_CharacterMoveSpeedComponent has been deprecated. If you want to change your character’s walk speed, you can do so directly by calling your character movement component. We have an example of this in BP_M2_PlayerCharacter (for more details, see The Example Character)

Changes to "combat mode"
Similar to above, IsInCombatMode and IsDead have been converted to BP custom anim vars, and are used in our M2Extras: CombatExample plugin

Changes to "custom movement"
The deprecated “Custom Movement Mode Primary Asset” system is no longer used. It has not been documented, and has not been actively maintained by MSquared for years.
Note that Unreal’s custom movement modes are still available. Custom physics will need to be provided if so, in the UpdateCustomMovement event on your pawn

J_CharacterMovementComponent, and so has been deprecated and removed from our base class. The node on the right is native Unreal's way of handling custom movement, and will still be available
A diagram of the relevant classes
Knowing the interaction of these classes is not essential, but this information has been provided if you want to know more about how the classes interact.
This diagram shows the changes to the assorted classes, and how they are related:
JM_AnimVarsComponenthas had a new base class introduced:M2M_AnimVarsComponent, whichM2M_CharacterBasenow points toJ_AnimInstancehas had a new base class introduced:M2_AnimInstance, whichABP_M2_Humannow points to.BPM_M2Example_PlayerCharacternow uses a BP-levelBPMC_M2_AnimVarsComponent, based off of the simplified base class, instead of using the deprecated anim vars.The deprecated BP classes (e.g. the
_Origin_ones) will still point to theJ_classes)

How to fix
Resolving the corrupted CharacterMovementComponent
NOTE: This breaking change is best fixed with knowledge of the project prior to upgrading. Please either check this flow before starting the upgrade, so you can make appropriate notes, or have access to a version of the project prior to the upgrade to hand, to easily compare between them.
The most significant action required is resolving the corrupted character movement component in classes extending M2_CharacterBase. You can fix it by doing the following:
Open your actor class.
If you see the following popup, that means your movement component was corrupted, and has been regenerated automatically.
(This is due to the parent class changing its default
CharacterMovementComponentto be the base component rather than previously setting it toJ_CharacterMovementComponent).

Review your auto-generated character movement component class. Since the movement component had to be regenerated, any manual changes to your previous movement component will have been reset.
Unfortunately, you won’t be able to compare changes via the diff, since the diffed version will have also been corrupted. Therefore, the best approach to get your changes to your character movement component class would be to either:
Make note of your changes to the movement component prior to the upgrade. You will be able to see any changes from the defaults since they will have the “undo arrow” by the property. Some edge cases to be aware of:
FaceLastAccelerationDirectionmay be off, due to theJ_CharacterMovementComponentmaking changes to this automatically. This should probably be set to true once moving off theJ_CharacterMovementComponent. Also, make note of theGaitSpeedsvalues.Jogwould be the default walk speed used, and you may want to re-add sprint to your project.
Open a version of the project prior to the upgrade, to compare side-by-side, and add any changes back to the upgraded version of your class.
Save your asset once you have reviewed your character. Even if you did not need to modify your movement component, the regenerated asset will need to be saved.
If you accept the simplified base classes (recommended)
Our recommended approach would be to use the simplified components. Most of the deprecated anim variables, movement component additions and the like are not widely used, and could be re-added in downstream projects if desired.
If you accept the new base classes, and are using the M2_CharacterBase, M2M_CharacterBase and ABP_M2_Human already, all you will need to resolve would be the corrupted movement component (see Resolving the corrupted CharacterMovementComponent).
If there are parts of the old functionality that you want to reintroduce into your project, this can be done at the blueprint level. A potential example would be if you want an equivalent to "gait speeds". We have an example flow of handling this in our M2Example plugin - including setting the movement speed on the native Unreal CharacterMovementComponent, and introducing a custom anim var to replicate the state and animate it for both regular and crowd characters. See Changes to gait speeds
If you want to keep using the deprecated classes (only recommended as a temporary solution)
If you want to use the deprecated anim vars, there are a number of places you will need to check:
These components are tightly interlinked, so we strongly recommend switching wholesale, or moving all the componets wholesale back to the deprecated classes. (e.g. if you use the deprecated character movement component, but don't update the anim instance or anim vars, some animations may be missing, or other issues will be encountered)
In your BPM, check the
AnimVarsComponentClass. Make sure that it extendsJM_AnimVarsComponent, or some child of that.

In your pawn, check your
Character Movement's details panel. Set it back toJ_CharacterMovementComponent. (If you want to keep values from before the breaking change, you will need to copy them across as outlined in Resolving the corrupted CharacterMovementComponent, since this step will recreate the component)
In your pawn, check the mesh’s
AnimClass. It will need to be set to an animation blueprint that extendsJ_AnimInstanceinstead ofM2_AnimInstance
Check your pawn set. In its crowd entry, it will need to point to the a
SkeletalAnimatedCrowdDatathat has the right anim instance
How to test it?
Open your character asset. Then PIE to verify that your character begins play, and moves as expected. If you see the Asset had a corrupted CharacterMovementComponent popup in either of the above steps, you will need to go through the How to fix process.
We recommend also checking the animated crowd (e.g. by testing with multiple clients and setting thePlayerClient.Rendering.NumInLOD0 live config override to 0), to ensure that it is also animating as expected.
If you previously used the J_CharacterMovementComponent, and are not using it any more, you may have compile errors if calling methods that are not present in CharacterMovementComponent. You should also search for attempts to cast to J_CharacterMovementComponent in your project. If there were any, they will fail.
Last updated
Was this helpful?

