Morpheus Platform Release v37
See this guide on how to update your existing project to a new editor release.
Version released: 23/05/2025
Please note v37 removes support for any build on v33.0.3 on Pixel Streaming.
IMPORTANT NOTICE
We currently expect v37 to be the final major release before MSquared transitions to Unreal 5.5, which is anticipated to bring significant improvements.
To minimize disruption, we strongly recommend upgrading your project to v37 in preparation for this change.
Performance guarantees
Our platform undergoes regular scale tests, and we are now publishing our Performance Guarantees.
New Unreal-based text chat
A new, less complex text chat solution which works at scale and does not require PubNub is now available: https://docs.msquared.io/creation/unreal-development/features-and-tutorials/communication/unreal-text-chat
Embedded browser now works on Mac
Support for WebUI on native clients has been expanded and it will now work on Mac, rather than just Windows.
Embedded browser logs to UE stdout
Debugging issues with the embedded web browser was challenging as it was not displaying any logging information when an issue occurred inside the browser process. These logs have been redirected and will display in Unreal's console / log files as expected.
UserID Tracker Subsystem
Regularly MSquared users needed to keep lists of clients who are involved in some gameplay functionality and needs to account for players reconnecting to the deployment. Maintaining a list of MAs wasn't sufficient as the client would be allocated a new MorpheusActor when they rejoined. To remove the need of each project having to roll out its own map between user IDs and MorpheusActors, we have a new subsytem which will do this for you: https://docs.msquared.io/creation/unreal-development/features-and-tutorials/helpers-and-extras/the-user-id-replication-component#userid-tracker-subsystem
Quality of life improvements
There's a large number of quality of life tasks which have been done for this release, which should lead to a more streamlined experience inside Unreal. Among them are:
Unreal Editor will now only require a single login.
The new map modal has been cleaned up.
Bot behaviors are now easier to set up.
UX Subsystem delegates rename and function signature changes
What’s broken and why?
We have removed references to launch context from the World Builder UX Subsystem in favour of using world Id.
The following blueprint exposed functions, delegates and variables have been renamed:
OnLaunchContextQueryHandled
>OnWorldQueryHandled
OnBeginLaunchContextImageDownload
>OnBeginWorldImageDownload
OnLaunchContextInfoUpdated
>OnWorldInfoUpdated
LaunchContextDescription
>WorldDescription
LaunchContextName
>WorldName
UpdateLaunchContextInfo
>UpdateWorldInfo
The following function signatures have also been changed:
UpdateWorldInfo
➖ OrganizationId (FString)
➖ ProjectId (FString)
➖ LaunchContextId (FString)
➕ WorldId (FString)
How to fix it?
Users should search for all occurrances of the old named functios, variables and delegates usage and resolve any blueprint compilation errors by making replacements according to the mapping above
How to test it?
You will know when your blueprints are compiling again
Removing SetAnimatedCrowdIsHidden function
What’s broken and why?
SetAnimatedCrowdIsHidden(...)
blueprint callable function to locally check hidden status for crowd on a morpheus actor has been removed.
How to fix it?
Use the blueprint callable function SetHiddenLocally(...)
of UMorpheusActorRenderTargetComponent
How to test it?
Calling SetHiddenLocally(...)
and IsHiddenLocally()
instead of UMorpheusActorRenderTargetComponent
will change the local visibility of the morpheus actor, regardless of the render target.
Deleted Unused Loudspeaker Prop “BP_LoudspeakerVolume_VisualFeedback”
What’s broken and why?
The asset BP_LoudspeakerVolume_VisualFeedback.uasset
has been removed from the M2 Example plugin as it contained multiple references to deprecated content and was overly complex as an example of using the global audio channel.
How to fix it?
If you require specific functionality from this prop, copy it into your project or use BP_LoudspeakerVolume_MicStand_VisualFeedback
in M2 Deprecated.
Otherwise we have BP_LoudSpeaker_Example
which can be found in the Example Map which is a more up to date and simplified example of how to implement this functionality.
Changing UserID Tracker Subsystem from a GameInstance subsystem to a World Subsystem
What’s broken and why?
The getter for the UserID Tracker Subsystem as a GameInstance Subsystem
will no longer work.
How to fix it?
Change the getter for the UserID Tracker Subsystem to get it as a World Subsystem
instead.
How to test it?
Ensure that the Get World Subsystem
node returns the UserID tracker subsystem correctly and that the UserID Tracker Subsystem is tracking users as expected.
Removed unused Niagra System “NS_CombatTest_NDC_Beam”
What’s broken and why?
The “NS_CombatTest_NDC_Beam” particle system we were not using has been removed from our content.
How to fix it?
Duplicate the asset and fix up references if needed. If you have not created your own assets using our particles, it is highly unlikely this will affect you as there were not references to the asset in our codebase.
Removed unused PlayerController “BP_M2_PlayerController”
What’s broken and why?
Created and never used, this has been replaced by BP_M2Example_PlayerController
in our example content.
How to fix it?
It is unlikely you will have referenced this asset, but if you have either duplicate this into project space before taking the update or re-base onto BP_M2Example_PlayerController
.
How to test it?
Ensure functionality remains intact
Changed Launch Context as the pubnub channel name to World Id
What’s broken and why?
We have renamed the live config variables and default channel naming behaviour in order to use the worldId:
Social.Chat.LaunchContextId
→Social.Chat.World
Social.Chat.LaunchContextSource
→Social.Chat.WorldSource
Social.Chat.Editor.LaunchContextId
→Social.Chat.Editor.World
Social.Chat.Editor.LaunchContextSource
→Social.Chat.Editor.WorldSource
The pubnub channel will now be named <world Id>
and will use the value found in the domain settings at runtime by default for both editor and deployments.
We recommend you use these settings unless you need to specify a specific channel name for use as it gates chat by the world that is being used and allows pubnub chat to be used in editor with no additional configuration.
The WorldSource
(previously LaunchContextSource
) options have been changed to:
LiveConfig
- Changeable at runtime for ALL players in a worldCommandLine
- Static at runtime and set when the client is launchedDomain
- (default) Changeable at runtime for each client
How to fix it?
If users have not previously modified the live config variables listed above in the following files then nothing needs to be done.
M2LiveConfig/Config/deployment.schema.json
- Check for var modifications<project>/Config/LiveConfig/Overrides/deployment.override.json
- Check for var existence
If you have previously modified the live config variables, you will need to modify the WorldSource
value to one of the below, depending on your usecase
Empty or
Domain
- this will set the pubnub channel name to your local world ID. To use this, you must have "Use Local World in PIE" enabled in your editor's sign in settingsLiveConfig
- will grab theworld
value from live config (e.g. the one set atSocial.Chat.Editor.World
CommandLine
- will grab the CLI launch arg worldId value (least likely to be used)
If any modifications have been made, please tranfer the values set in the old live config variables to each equivalent new variable according to the mapping above.
How to test it?
Launch a deployment or PIE and send a message. If the message is successfully sent the sender will see it appear in the chat widget and this has been successful.
Renamed the web platform world services
What’s broken and why?
We have renamed the MSquared world service classes, to better match our conventions:
BP_M2_WPKeyValueStoreService
→BP_M2_KVStoreService
BP_M2_WPProfileDataProvider
→BP_M2_ProfileDataProvider
BP_M2_WPRoleDataProvider
→BP_M2_RoleDataProvider
The references have been fixed up, and the world settings’ default config has been updated MSquared-side. However, If you modified the world service classes in your project’s own config, referencing the old names, they will need to be updated
How to fix it?
If you see missing classes in your world settings, check for the old file names in your project’s config and update them, or alternatively select the right files in the dropdown.
If you modified the world service classes in your project’s own config,
How to test it?
Go to your world settings, and search for “services”. The three named world services should still be present.

Flipped bCheckIfRolesDataTableIsValid to “false” by default
What’s broken and why?
This is unlikely to affect most projects. If you are still using the legacy Roles (now located in the Morpheus Platform - Deprecated|Roles
section of our World Settings), which we deprecated in a previous release, you will find the default value of bCheckIfRolesDataTableIsValid
has changed from True to False. This is because we no longer require this check in the currently supported Roles system and leaving this legacy setting enabled could cause confusion when warnings are given to customers using the new system.
How to fix it?
Go to Morpheus Platform - Deprecated|Roles
in the affected map and change bCheckIfRolesDataTableIsValid
to True.
How to test it?
Warning should be given if no Roles table provided
Disabled email-based fallback sign in
What’s broken and why?
Previously we were able to use multiple methods of signing in, but now the only accepted method of authentication is SSO. We had a widget that would pop up on failed sign in that would give the option to sign in with email or password. Now this option is not provided and if SSO fails, users will not be able to enter via alternative means.
How to fix it?
There is no fix for this. If this is required functionality, please reach out.
Replaced references to BPM_VideoScreen in BP_MillicastCapture
What’s broken and why?
Under Scene Capture > Show Only Actors in BP_MillicastCapture we no longer use BPM_VideoScreen, having replaced it with the non-deprecated BPM_VideoPlayer asset.
How to fix it?
If you use BPM_VideoScreen still, you will need to re-add this to your list of actors to be shown. This can be done on instances of your BP_MillicastCapture or a locally modifiable duplicate of this asset.
How to test it?
Confirm functionality remains as before.
Deprecated old “user data” and Key Value/persistence APIs
What’s broken and why?
The following systems have been deprecated, in favour of our single KV Store system (https://docs.msquared.io/creation/unreal-development/features-and-tutorials/online-services/kv-store-service):
UserDataStore
WebPlatformKeyValueStoreService (not to be confused with the still present
M2_KeyValueStoreWorldService
, renamed toM2_KVStoreService
)M2_PersistenceSubsystem
Since we are no longer using this system, the now irrelevant bootflow steps
HandleUserDataReady
andHandleInitialValuesReceived
have been deprecated too.
How to fix it?
Please move to the new system as soon as convenient. Your existing logic won’t break, but you will get compiler warnings, and you won’t be able to use the deprecated nodes past their current usage in your project.
If you were using the persistence subsystem, we have a guide for ease of migration: My project is using the now-deprecated Persistence Subsystem. How can I migrate across?
How to test it?
Your logic does not have compiler warnings for using the old systems
Changes to the KV Store implementation
What’s broken and why?
There have been a few changes to the example KV Store service (BP_M2_WPKeyValueStoreService
) and its related files, that would require some attention, if it is currently being used:
SM2_WP_KvStoreObject
has been removed, andSM2_WP_KvStoreReadItem
has been updated to treat theobject
as a generic Json Object.This makes the struct more flexible, supporting other json value types, rather than just
JsonObject
for the fields within theobject
field, e.g.Data
We now no longer reject “non-json” string values, instead treating them as “json string values”. e.g. a string
Hello
will now be treated as the json value"Hello"
, rather than being rejected.This improves the UX for generic KVStore usage, enabling stores more akin to
Store(”KeyName”, “ExampleValue”)
, rather than needingStore("KeyName", { "Value": "Examplevalue"})
How to fix it?
If you referenced
SM2_WP_KvStoreObject
, orSM2_WP_KvStoreReadItem
, please update your logic accordingly, e.g. by following the example inBP_M2_WPKeyValueStoreService::ParseReadResponseItem

If your logic depended on non-json strings being rejected, please update the
KVStoreServiceClass
to a custom implementation of your choice, usingBP_M2_WPKeyValueStoreService
as a starting point

How to test it?
Everything should compile correctly
Example Moderation Component now uses Example Crowd Audio Component
What’s broken and why?
Previously BPMC_M2Example_ModerationComponent
used our legacy Crowd Audio component (BPMC_CrowdAudio
) when sending transcripts to a moderator. As we are simplifying the CrowdAudio component but want to leave the legacy version intact, we have replaced the reference here to BPMC_M2Example_CrowdAudioComponent
.
How to fix it?
This issue will only affect users that are using BPMC_M2Example_ModerationComponent
with a legacy character class, or that still use the BPMC_CrowdAudio
.
If you use BPMC_CrowdAudio
, you will need to duplicate BPMC_M2Example_ModerationComponent
replace all references to BPMC_M2Example_CrowdAudioComponent
with BPMC_CrowdAudio
and then replace your moderation component with this duplicated and modified version.
It should be noted that we will not be maintaining BPMC_CrowdAudio
any further, so if you want a higher level of support it is recommended you switch to the example component as the legacy one will be removed when the M2 Deprecated plugin is removed.
How to test it?
Ensure moderation functionality is maintained after following the above steps and you are still able to receive transcriptions.
Removed Interaction widget from Example HUD
What’s broken and why?
The Example HUD created when starting a new project from a template no longer features the deprecated Interaction widget. This will also affect anyone directly using the engine version of WBP_M2Example_HUD
How to fix it?
We highly recommend you do not use the M2 Interaction system as this is deprecated. If you are dependent on this and relied on it in this HUD, you will need to re-add the M2Deprecated/M2Core/M2ObjectInteraction/WBP_M2_FullInteractionMenu
widget to your HUD
How to test it?
Ensure that desired interaction functionality is still present
Changed AutoProfiler SessionData Fields
What’s broken and why?
Previously, all ActorCommandExecutorTasks
in the AutoProfiler SessionData would be called with the same optional parameter. This meant that Carnival would attempt to load avatars with the name of sublevels to load and the world would attempt to load a sublevel with an MML URL. Now the SessionData requires the specific task and parameter for each ActorCommandExecutorTask
. The original “Optional Parameter” field has been removed in order to improve this.
How to fix it?
ActorCommandExecutorTasks
in any AutoProfiler SessionData assets will need to be reconfigured by filling in the new fields.

How to test it?
The AutoProfiler should function as expected prior to this change and should not interfere with other ActorCommandExecutorTasks
.
Removed the world travel portal from WorldTravelDestination_P
WorldTravelDestination_P
What’s broken and why?
The WorldTravelDestination_P
test map has had its world travel portal removed. This is because it used the now deprecated interaction system, and the map has been updated to use the simplified character, which doesn’t use said system. This means that if you do try and access that world, you will not be able to world travel using the portal

How to fix it?
In the unlikely case that you were using WorldTravelDestination_P
, you will need to use alternative approaches to world travel out of the map. e.g. instead of interacting with the world travel portal, you can instead use the WorldTravel.TravelToWorld [WorldId]
console command
Removed Walk binding from IMC_CharacterMovement
What’s broken and why?
As we no longer have a walking animation in our default Animation Blueprint, we have removed the corresponding key binding
How to fix it?
You will need to use an Input Mapping Context in your project that maps IA_CharacterWalk to an input (previously the Ctrl keyboard button)
How to test it?
Implement the above and ensure character moves as expected when button is used
Get BPCharacter removed from ABP_M2_Human.uasset
What’s broken and why?
The function “Get BPCharacter” in ABP_M2_Human is no longer available. It has been removed as there are no references to it within the Morpheus Platform and it’s presence creates a dependency on deprecated content.
How to fix it?
If you rely on this within the default ABP you can either duplicate the asset to preserve your current version, or duplicate the new version and add the following:

Please not that due to the lack of Child ABP’s, duplicating this asset means you will have to repeat this any time you wish to take further ABP updates from our default class.
How to test it?
Follow the steps above if applicable and ensure functionality is consistent.
Analytics BP API Removed
What’s broken and why?
Analytics API that was deprecated in v34 has now been removed in full. Please see the release notes on v34 for further information.
How to fix it?
Customers are expected to replace any usage of this API with their own analytics integration. See https://docs.msquared.io/integrations/3rd-party-analytics#setting-up-mixpanel-analytics for an example integration.
M2 Human ABP simplified and multiple states removed
What’s broken and why?
The base ABP for M2 projects, ABP_M2_Human, has been reworked, resulting in a more streamlined ABP with improved combat animations using assets from Lyra and less custom M2 behaviour overall.
The following functionality has been removed from the ABP:
Double jump
Walking
Launch
Low gravity
Bounce
Zero G
Non-combat head turning
Multiple random idle animations
The old ABP is now ABP_M2_Human_Old in the Deprecated plugin.
How to fix it?
If your project relied on the above removed animation behaviour, you can temporarily set your characters to use the ABP_M2_Human_Old ABP (in the Deprecated plugin) instead. This will be removed in a future release, so if you rely on this behaviour, we recommend copying the logic you rely on from this old ABP to your own ABP class.
How to test it?
Test all your gameplay and observe whether the animations are behaving as expected.
Check replicability of blueprint properties at compile time
What’s broken and why?
In the blueprint editor, it’s possible but erroneous to mark an Event Dispatcher as “Replicated”. That causes an Ensure to fire in PIE, and maybe in standalone.
This change makes that mistake visible by introducing a blueprint compile error.
How to fix it?
Disable replication for Event Dispatchers in blueprints.
How to test it?
Only affects blueprint compilation - if everything cooks then all is well.
Removed AudioControls and AudioMixManager from default Singletons
What’s broken and why?
The Audio Controls Class and Audio Mix Manager Class is no longer present in the default Singletons list in World Settings. This is because we are deprecating the BP content used for these.

How to fix it?
You will need to add BPM_AudioControls
and BPM_M2_Audio_MixManager
as additional singletons to your World Settings for any map you intend to use these in.
How to test it?
Ensure your world still has access to this functionality after adding them manually.
Crowd audio changes to schema and removal of echo cancellation and dynamic occlusion
What’s broken and why?
Echo Cancellation has been removed as an option from crowd audio settings.
Dynamic Occlusion has been removed as an option from crowd audio settings.
PreprocessorSettings has been split into NoiseSettings and VolumeNormalisationSettings.
Some ObserverSettings have been separated into OcclusionSettings.
Some parameters have changed their category in LiveConfig.
How to fix it?
Echo cancellation and dynamic occlusion are no longer supported features. It’s unlikely your project was using them in a noticeable way, but if they were, please reach out to @Samuel Silvester.
If your project has any live config overrides to crowd audio settings, check the latest morpheus.schema.json to make sure your live config overrides still match the schema. Make sure that your editor sessions run without any schema warnings or errors, or your live config overrides will not be respected.
If your project has modified any crowd audio settings in BPs, double check to make sure these are still applied correctly.
How to test it?
Run editor sessions and ensure no live config errors or warnings are output.
Ensure that the crowd audio in your world is still functioning as intended.
Last updated
Was this helpful?