Morpheus Platform Release v39

See this guide on how to update your existing project to a new editor release.


Version released: 29/08/2025

Please note v39.0.0 removes support for any build on v35.0.0 on Pixel Streaming

Release notes

NPC crowds

It is now possible for your project to have crowds of NPCs which can be customised with your own models and animation. See the documentation here: Crowds of NPCs.

New default avatars

The default avatars have been changed to use MSquared Avatars. These avatars are highly optimised for our crowd system and guaranteed to work at scale.

Testing reconnection flow

You can now simulate players disconnecting and reconnecting, or connecting as late joiners through the /disconnect and /reconnect commands. See our Testing Reconnection and Disconnection page for more information.

Replicated vehicles

We've added support for replicated vehicles within the Morpheus Platform, causing them to look physically simulated in LOD 0.

iOS support

MSquared has been making steady progress towards an iOS native client, and v39 is the first version which allows deploying to iPhone. This is currently highly experimental and requires an iPhone 15 Pro or iPhone 16. If you are interested in the iOS native client, please reach out to one of your support engineers.

Crash reports dashboard

We've created a dashboard which allows an organisation to see reports for any crashes that players experience. The full documentation can be found in Crash reporting.

Known issues

DefaultPawnSet isn't guaranteed to be cooked

We received a report that if you set your DefaultPawnSet to an asset that is not referenced elsewhere in your codebase, it is not guaranteed to be cooked.

Missing Audio Component Events

We have identified an issue with Unreal Engine 5.5 when it comes to playing audio components. After the world has initialized, the component's OnAudioPlaybackPercent and OnAudioFinished events stop playing (due to some internal failing when passing work between the audio thread and the game thread). So far we have not seen any other issues with the playing of audio, and the lack of these events can be worked around with tick behavior and delays based on the audio source's duration.

Millicast screens

If a Millicast Screen is in a BP loaded sublevel, it's possible for the controls not to detect this screen as an option to stream to. We have updated our documentation to address this.

Breaking changes

Removed OWLMediaProductionToolkit plugin

What’s broken and why?

The third party plugin OWLMediaProductionToolkit has been in the Morpheus Platform, but unused. As it is a licensed plugin, keeping it would incur significant costs and it increases our maintenance area without providing a tangible benefit.

As such, the plugin has been deleted and is no longer available.

How to fix it?

As the plugin has been removed, there is no workaround. If this removal causes you issues, please contact MSquared.

How to test it?

Check if your project loads successfully using the latest version of the Morpheus Platform.

Removed Example Purchaseables

What’s broken and why?

The following classes and structs were removed:

  • FAnotherPurchaseableTableRow

  • UAnotherPurchaseable

  • AExamplePlayer

  • FExamplePurchaseableTableRow

  • UExamplePurchaseable

  • AExampleSingleton

These were used in C++ only internally to validate the purchasing system. No content was added that referenced these, but there is a very small chance someone has created a class that inherits from these test classes accidentally.

How to fix it?

If you have never used M2’s Currency, Transaction or User Collections it is highly unlikely you will have used these.

If you have, it is still unlikely you will have used these but check your purchaseables to ensure they don’t inherit from or reference these classes.

It is important to note that support for Transactions/Currency has been previously dropped, with large areas of it deprecated in C++. If this change does affect you, please speak to your support contact for advice on this.

How to test it?

Content using this should not be fixed, it needs to be migrated to use another system such as the KV Store. Support will be able to outline alternatives for you.

Morpheus Arrays working with redirectors

What’s broken and why?

Morpheus Arrays in BPs will no longer have their correct inner type defaulting to integers.

This is due to a refactor in the Morpheus Arrays inner type to integrate with Unreals redirectors preventing crashes when redirected types are used as an Inner type to the MorpheusArray.

How to fix it?

  • Find the broken BPs containing a Morpheus Array

  • Re-pick their correct Inner Type.

  • Re-compile the blueprint and save it.

How to test it?

Make sure Morpheus Arrays are working as expected and all blueprints are compiling fine.

Replaced the example character’s footsteps logic with a simplified equivalent

What’s broken and why?

BPC_Audio_MovementSystem has been deprecated, in favor of a simplified component (outlined in https://docs.msquared.io/creation/unreal-development/features-and-tutorials/the-m2-example-plugin/footsteps-audio), along with some dependent assets. The old component and assets will still be accessible from the M2Deprecated plugin, but will not be actively maintained.

How to fix it?

If your project relies on the old BPC_Audio_MovementSystem, we recommend migrating across, or making a copy of the required assets in your own project.

For more details of the changes, see https://docs.msquared.io/creation/unreal-development/features-and-tutorials/the-m2-example-plugin/footsteps-audio#i-was-using-the-now-deprecated-bpc_audio_movementsystem.-anything-to-be-aware-of

How to test it?

Walk around in PIE. Footsteps should sound as expected.

Moved misc assets to M2Deprecated

What’s broken and why?

The following folders have been moved into M2Deprecated, since they are not part of the core Morpheus Platform offering:

  • M2Content/Audio/Ambience

  • M2Content/Audio/System/UnifiedAmbience/

  • M2Content/Audio/System/CrowdSimulation

  • M2Content/Geometry

  • M2Content/InputActions

  • M2Content/Environment

  • M2Content/MaterialLibrary/SmartSurfaces

  • M2Content/Props

If you reference assets in these folders, you may get errors due to them being missing.

How to fix it?

If you enable the M2Deprecated plugin, the assets will redirect. Any assets that you depend on, we advise making local copies of and referencing in your own content, since we do not intend to support the assets long-term

How to test it?

Check for any errors or compilation failures - if there’s anything related to missing Audio assets from these folders, they can be fixed as outlined above.

J_CharacterMovementComponent and J_AnimVarsComponent have been deprecated, simplifying to CharacterMovementComponent and M2_AnimVarsComponent

What’s broken and why?

The following changes have been made to the M2 character and morpheus actor, 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:

  • The existing JM_AnimVarsComponent has now been deprecated, in favour of a stripped back M2M_AnimVarsComponent.

    • The following anim vars have been removed:

      • IsWalking

      • IsDoubleJumping

      • HasBeenLaunched

      • HasLowGravity

      • HasZeroGravity

      • IsMovingInLowGravity

      • IsThrustingUp

      • IsThrustingDown

      • IsBouncing

      • IsSliding

      • IsAiming

    • The following anim vars have been modified:

      • IsJogging

      • IsSprinting

      • IsInCombatMode

      • IsDead

  • 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

      • Some minor helper functions, like AddGravityMultiplier and AddGaitSpeedMultiplier

    • The following features have been modified:

      • “Gait speeds”

      • “Combat mode”

    • Due to M2_CharacterBase's CharacterMovementComponent class being changed, unfortunately assets extending it will have their component corrupted. If this affects your character, you will see the following popup when attempting to play or open your asset.

      image.png

For more details on this change, see https://docs.msquared.io/creation/unreal-development/release-notes/breaking-changes-further-details/breaking-change-details-deprecating-j_charactermovementcomponent

How to fix it?

If you are using the example plugin content as a base, or building off of the core M2 classes, you will have one of two options:

  • Use the simplified components (Recommended)

    • Using the logic in the Morpheus Plugin as reference you will be able to achieve the same functionality as was achieved via the deprecated code classes entirely in blueprints.

  • Switch back to the deprecated components (only recommended as a temporary solution)

For details on these, see https://docs.msquared.io/creation/unreal-development/release-notes/breaking-changes-further-details/breaking-change-details-deprecating-j_charactermovementcomponent

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 it? 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.

AActor.bReplicateMovement replaced with MorpheusActorMovementComponent.bMorpheusReplicateMovement

What’s broken and why?

Morpheus no longer uses the AActor.bReplicateMovement property to determine whether movement is replicated. This field is now hidden and you should use MorpheusActorMovementComponent.bMorpheusReplicateMovement.

How to fix it?

For any classes that have changed the bReplicateMovement property from the default, the movement will continue to replicate as per your custom setting for this release, but you will get an error log at runtime asking you to resave your asset. This error and auto-fix will be removed in future version.

Resave all your assets that have changed the bReplicateMovement value from the default. This will fix up the bMorpheusReplicateMovement property to its previous value.

How to test it?

Ensure that movement is replicating property for all objects in your game.

Removed r.SkylightIntensityMultiplier override on low/medium graphics settings

What’s broken and why?

We previously made a change to the Unreal defaults to set the r.SkylightIntensityMultiplier to 0.05 on Low and Medium graphics settings, which can improve visual fidelity on indoor scenes. However it can lead to very black shadows on outdoor scenes, which can look bad.

The change is to remove the override and restore the Unreal default value of 1. Projects are free to make their own tweaks to this value based on their own lighting setups, and the default is now the same as in a vanilla Unreal project.

How to fix it?

To restore the previous behaviour, edit or create a file called DefaultScalability.ini in <ProjectDirectory>/Config, which will override the defaults. Add this to the file to apply the old settings (or change the values as you like):

[GlobalIlluminationQuality@0]
r.SkylightIntensityMultiplier=0.05

[GlobalIlluminationQuality@1]
r.SkylightIntensityMultiplier=0.05

How to test it?

Test your level on Low and Medium graphics settings to ensure the lighting looks correct.

Hidden Assets upload button behind setting

What’s broken and why?

There is no change unless you were already using the Assets and Releases system. If you are not aware what this system is then you can ignore this breaking change.

The assets upload button has been hidden behind a new setting that is default set to off. For projects using this functionality they will need to toggle this setting and commit the changes.

How to fix it?

Navigate to and enable Project Settings > Morpheus Platform > M2 World Builder > Assets > Enable Assets Upload (Experimental).

How to test it?

You should see the assets button in the top right of your editor again.

You can also verify the change was successful by looking for the setting bEnableAssetsUpload=True in DefaultGame.ini for your project. If the setting is set here, it can be source controlled so other developers do not need to make this change too.

Removed several unused maps

What’s broken and why?

The following maps have been fully removed from the platform:

  • /M2Core/Content/JunoAssetLoader/Maps/ - These maps were for internal testing and no longer used

    • LevelInstanceLoader_TestWorld

    • LevelStreamer_TestSublevel

    • LevelStreamerUnload_TestWorld

    • LevelStreamer_TestWorld

  • /M2Content/Maps/TestGyms/Video/M2VideoTestGym

    • The VideoPlayer asset has been deprecated and an alternative is being provided in the ExampleMap

  • /M2Core/JunoActivities/Maps/TestLevel

    • Activities are already deprecated and due for removal in v39

How to fix it?

If you need these maps you can copy them into you project locally, but there is no good reason to given the reasons listed above.

Deprecated BPM_VideoPlayer

What’s broken and why?

The old BPM_VideoPlayer has now been deprecated, due to being temperamental, and very C++ driven (making it difficult for downstream users to dig into). It has now been replaced by some completely BP example content: BPM_M2Example_SyncedVideoPlayer and BP_M2Example_VideoPlayerMirror.

Since M2Deprecated has now been turned off by default, this means that if you were using the old video player, it will be missing until you manually enable the plugin.

How to fix it?

If you need the old video player, you can re-enable M2Deprecated as a stop-gap, but best approach would be to migrate to using the BP-only examples, or making your own.

How to test it?

Check for any uses of video players in your map. They should still work.

Disabled M2 Deprecated plugin by default

What’s broken and why?

The M2 Deprecated plugin that contains things like the Legacy Origin and Approachability characters has been disabled by default. This content is still available in the latest release, but will need enabling to use. This has been done because MSquared no longer tests, maintains or supports this content as part of our initiative to reduce the surface area of the platform to deliver higher quality content and API’s we intend to support going forwards. Disabling this by default reduces the risk of customers using content they are unaware has been deprecated.

How to fix it?

If you are concerned that your project will not load correctly as there is M2 Deprecated content in your default map, you can add the following to your projects .uproject file to ensure it is enabled on launch.

		{
			"Name": "M2Deprecated",
			"Enabled": true
		}

Alternatively you can enable the plugin by launching the editor and ticking M2 Deprecated in Edit > Plugins

image.png

We advise that you start working out a migration plan for breaking your dependency on content within M2 Deprecated. There are a number of ways of doing this:

  1. Build your own base classes to replace the legacy M2 ones

  2. Reparent your content to non-deprecated content in the platform

  3. Migrate the desired legacy content from the M2 Deprecated plugin into your own project

Option 1 gives you the greatest long term stability and control. You will be building using our API’s directly and should be far less impacted by breaking changes by reducing dependence on shipped content.

Option 2 is a great way to get a similar level of stability but at the potential sacrifice of control, given there is a Blueprint layer between your content and underlying code. This may be a worthwhile trade-off as it does mean there could be less that you need to implement yourself if we have already provided base/example functionality.

Option 3 may well be the fastest way to keep your project functioning as expected. This route does pose a degree of risk as there may be BP API within the content that has also been deprecated, that you will need to replace or risk losing all related functionality. You will want to ensure all content needed (the desired content and any dependencies) has been migrated, so make sure you test by turning M2 Deprecated off from time to time.

How to test it?

If you are not using any content from the M2 Deprecated plugin, there is nothing to do.

If you are using M2 Deprecated content, check your content functions as expected after re-enabling.

Last updated

Was this helpful?