This document is about: QUANTUM 3
SWITCH TO

Release Notes 3.1

3.1.0

RC

Breaking Changes

  • [Packaging] Quantum.Deterministic.dll was merged into Quantum.Engine.dll. Delete the remnants of the old dll from projects that migrate to SDK 3.1
  • [Packaging] Photon Realtime is now embedded in the Quantum package (Assets/Photon/Quantum/Runtime/Realtime, assembly Quantum.Realtime). Its scripts were merged and have new script GUIDs. Delete Assets/Photon/PhotonRealtime and Assets/Photon/PhotonLibs by hand and add the reference GUID:73202fbdf404a7c438fa1b7b7d5c6957 (Quantum.Realtime) to custom asmdefs that reference Photon Realtime. To use Photon Realtime from its own UPM package instead, define QUANTUM_DISABLE_REALTIME
  • [Packaging] The .NET (non-Unity) Quantum DLLs, the .NET simulation DLL and the console runner are now built against net10.0. Projects using the Quantum plugin SDK have to upgrade it together with the Unity SDK; deploy_win was removed from the plugin SDK search path
  • [Packaging] Quantum.Profiling.HostProfiler was renamed to Quantum.HostProfiler
  • [Math] Lookup tables were removed from the SDK; FPMath now uses polynomials and other approximation methods. Delete Photon/Quantum/Runtime/RuntimeAssets/LUT, QuantumLookupTables.cs and QuantumUser/Resources/QuantumLookupTables.asset after upgrading. FPLut is obsolete, and the spectator and console runner no longer have the LutProvider parameter, the LutFolder setting or the LUT path argument
  • [CodeGen] The Globals layout changed. Re-run the Quantum CodeGen after upgrading
  • [CodeGen] Event IDs are no longer const but static properties, which reduces cascading code changes when events are added or removed. To revert to the old behavior, add ConstEventIds to LegacyCodeGenOptions in Project Settings > Photon Quantum > Code Gen
  • [Simulation] The API for sending and processing commands changed, so multiple commands per frame can be sent without managing a CompoundCommand. Commands are sent with QuantumGame.AddCommand(DeterministicCommand) and processed with an iterator: foreach (var command in frame.GetPlayerCommands<MyCommand>(player)) { }
  • [Simulation] The FrameContextUser constructor signature changed to FrameContextUser(Args args, IRuntimeConfig runtimeConfig); the runtime config is passed from QuantumGame
  • [Simulation] Frame.DeltaTime is now derived from Frame.GameTimeScale at the start of each frame. Setting DeltaTime sets GameTimeScale instead and takes effect from the next frame on. Disable SimulationConfig.GameTimeScaleAffectsDeltaTime to keep the legacy behavior. FrameTimer seconds are converted with the simulation rate and no longer follow a modified Frame.DeltaTime; use GameTimer for timers that pause or slow down
  • [Views] QuantumGame.Frames.PredictedPrevious and PreviousUpdatePredicted are only separate frame copies when QuantumGameFlags.IsLegacyFrameCopiesEnabled is set; otherwise they alias the Verified frame. QuantumGameFlags.DisableInterpolatableStates, DeterministicSessionArgs.DisableInterpolatableStates and DeterministicSession.IsInterpolatable are obsolete and replaced by IsLegacyFrameCopiesEnabled, which has the inverted meaning and is off by default. QuantumEntityView.InterpolationMode defaults to ExponentialDecay
  • [Views] QuantumEntityView.Initialize() no longer takes the QuantumEntityViewUpdater. Set the SnapshotInterpolationTimer property instead
  • [Views] onlyIfActiveAndEnabled for QuantumCallback.Subscribe and QuantumEvent.Subscribe is now true by default, so events and callbacks are no longer raised for disabled and pooled GameObjects and entity views. Define QUANTUM_ENABLE_LEGACY_SUBSCRIBE_PARAM to restore the old behavior

What's New

  • [ECS] Added table components, an alternative to the sparse set ECS components that scales better. See the documentation for details
  • [ECS] Added a Storage field to SimulationConfig.Entities.ComponentTypeConfiguration to override the default storage mode of a component (e.g. sparse set, table)
  • [ECS] Added optional filter components. Entities missing an optional component are not skipped; NextUnsafe (or the filter struct) outputs null for its pointer
  • [ECS] Added the QList<T>.Iterator.CurrentPtr property to iterate a list by pointer without copying its entries
  • [ECS] Added compound prototypes: Quantum prefabs can have nested QuantumEntityPrototype components and are baked with EntityPrototype.Nested set. The root entity of a materialized compound prototype gets the new built-in EntityGroup component, which ties the lifetime of the nested entities to the root (see FrameBase.GetEntityGroupIterator). Disable it with QuantumEntityPrototypeAssetObjectImporter.EnableNestedPrototypes or the define QUANTUM_DISABLE_PROTOTYPE_GROUPS
  • [ECS] Added Frame.SystemExists<T>() to check if a system type was created at simulation start. The other system-enabled queries now log a warning instead of an error when the system does not exist
  • [ECS] Added an OnResync() method to all Quantum systems, which is called when the simulation is about to begin after starting from a snapshot
  • [Simulation] Added QuantumGame.SendBufferedCommands() to dispatch all queued commands immediately
  • [Simulation] Added the Quantum callback CallbackGameResultResponse to react to completed game result operations
  • [Simulation] Added SimulatorContext, which exposes simulation callbacks that can modify future simulation and prediction advancements (e.g. SkipPrediction, IsRollbackRequired, WillRollbackPrediction, HasRolledBackPrediction, LatestVerifiedRolledBackTo). See the documentation for details
  • [Simulation] Added the simulator callbacks CallbackBeforeSimulationStage and CallbackSimulationStageFinished, and CallbackSimulateFinished now carries the SimulatorContext. The context can skip the prediction rollback (SkipPredictionRollbackIfPossible) and limit the verified ticks per update (TicksToVerify, DeterministicSession.MaxVerifiedTicksPerUpdate)
  • [Simulation] Added the Quantum Unity script QuantumRunnerRollbackPolicy.cs, which implements rollback and simulation pacing rules for performance optimizations. The QuantumStartUI prefab includes it by default
  • [Simulation] Added game time: Frame.GameTick is a tick counter advanced by the simulation that can be paused or slowed down with Frame.GameTimeScale, and GameTimer is a timer based on it. 2D and 3D physics support a delta time of 0 (paused), in which case only collision detection and callbacks run
  • [Simulation] Added Frame.UnscaledDeltaTime, which ignores Frame.GameTimeScale
  • [Simulation] Added FrameTimer.Duration and FrameTimer.DurationNormalized(), e.g. to display a cooldown
  • [Simulation] Added SimulationUpdateTime.EngineUnscaledCappedDeltaTime, which uses a capped unscaled delta time and improves the support for breakpoints and pausing the Unity Editor in local mode
  • [Physics] Added the physics solver ProjectedGaussSeidel, which greatly improves the stability of stacked rigid bodies. The legacy solver can still be selected in the SimulationConfig
  • [Physics] Added the SimulationConfig.Physics.Substeps setting (default 2), which repeats integration and constraint solving with a fraction of the delta time for more stable physics at lower simulation rates. The default SolverIterations was lowered from 4 to 2 to keep the solver cost similar
  • [Physics] Added SimulationConfig.Physics.ScaleSubstepsWithGameTimeScale (enabled by default) and MaxScaledSubsteps. Physics runs proportionally more substeps when Frame.GameTimeScale is above 1, so the solver, joints and springs behave as they do at a time scale of 1
  • [Physics] Added a standalone 3D physics solver API, available through the static class Quantum.Physics3D.CollisionSolver
  • [Physics] Added PhysicsBody3D.ComputeWorldInertiaTensorInverse to compute the world-space inverse inertia tensor of a physics body
  • [Physics] Added support for scheduling multiple physics updates in the same frame simulation
  • [Physics] Added physics CheckOverlap and CollisionChecks.Check overloads that check two Shape2D or Shape3D pointers with their transforms (including compound shapes, adding a hit to a HitCollection for each overlapping pair of primitive shapes), and a frame-less overload for 2D primitive shapes other than polygons
  • [Physics] Added 2D and 3D PhysicsCollider.Create overloads without a frame parameter for shapes other than compounds
  • [Physics] Added the static methods PhysicsMaterialData.GetCombinedRestitution and GetCombinedFriction to get the combined settings of two interacting physics materials
  • [Physics] Added PhysicsSceneSettings.DefaultPhysicsMaterialData, which is initialized from the Physics Material asset defined in the SimulationConfig
  • [Physics] Added the InvokeSpeculativeCallbacks setting to the SimulationConfig (enabled by default), which allows CCD callbacks to be called even after the first non-trigger collision. Check this condition with the IsSpeculativeCcdCollision property of the callback info structs
  • [Physics] Added the physics query option QueryOption.SleepingOnly, which ignores awake bodies when combined with the HitDynamics flag
  • [Physics] Shape3D.GetLocalSupport now supports capsule shapes
  • [Physics] Added the CharacterJoint3D joint type, useful for ragdolls and ball-and-socket constraints and configurable via the PhysicsJoint3D component prototype
  • [Physics] Added the QuantumRagdoll MonoBehaviour, a wizard-like component that creates ragdolls and updates their view elements from the simulation state. It supports limb, head, chest and hips settings with per-limb overrides for asymmetric ragdolls, a physics material for all limb colliders, gizmo handles and baking from an Animator. A template ragdoll can be created via Hierarchy > Quantum > 3D > Ragdoll Entity
  • [Physics] Added support for multiple Unity colliders as the source of a Quantum compound shape prototype, and for a 3D Unity capsule as the source of a 2D Quantum capsule shape
  • [Physics] Added terrain collider features: QuantumStaticTerrainCollider3D.Asset is now optional (the terrain is baked directly into the map mesh data), and terrains can be baked automatically with the map (QuantumEditorSettings), down-sampled during baking and assigned a PhysicsMaterial. QuantumHeightMap provides the FP heightmap storage and operations that used to be part of the TerrainCollider asset
  • [Physics] Added MapDataBakeCallbacks.OnCollectColliders2D/3D, which is called during collider baking with the list of colliders found in the scene. Colliders can be added to or removed from the list (e.g. to prune colliders outside the playable area)
  • [Physics] Added TriangleMesh.SerializeMutableData to skip the mutable triangle data during serialization, which reduces the snapshot size when the mutable data was not modified or the modifications can be replicated on deserialization
  • [Physics] Added the option to import the Unity physics layer list and matrix automatically, and to import the layer list without the matrix
  • [Math] Added FPVector2.Average and FPVector3.Average to compute the average of a span of vectors
  • [Math] Added non-biased random number generation methods to RNGSession: Next(long, long), NextInclusive(long, long), Next(uint), Next(ulong), NextUInt32() and NextUInt64()
  • [Math] Added the FPMath.Sort API for spans and buffers, using either a comparer delegate or a comparable field
  • [Math] Added static methods to get the rows or columns of FPMatrix2x2 and FPMatrix3x3
  • [Math] Added index operators to FPVector2, FPVector3, IntVector2 and IntVector3 to access their x, y and z components
  • [NavMesh] Added the Heuristic Weight setting to NavMeshAgentConfig, which can improve the performance of the A* algorithm; try setting it to 1.5
  • [NavMesh] Added a NavMesh import option to load auto-generated navmesh links directly from the Unity navmesh (Unity Editor only)
  • [NavMesh] Added the attribute [UnityNavMeshArea] to assign a Unity navmesh area drawer
  • [CodeGen] Added #ifdef, #ifndef, #else and #endif to .qtn files. The symbols come from GeneratorOptions.Defines (NAME or NAME=value; symbols with a value also become constants)
  • [CodeGen] Added the signal struct keyword. The signal parameters are passed to systems as a generated {SignalName}Args struct (e.g. OnHit(Frame frame, ref OnHitArgs args)), so parameters can be added later without changing the signal interface implemented by the systems
  • [CodeGen] Unions now have a generated TryGet<Field>(out T value) method for each field, which reads the value without changing the union's used field
  • [CodeGen] Added #pragma module <name>. A .qtn file with this pragma emits its output (components, prototypes, events etc.) to a set of module-specific .cs files, which can be used to break apart the "core" module when it becomes too unwieldy
  • [CodeGen] Added access modifiers for fields and types; public is still the default
  • [CodeGen] Added QuantumQtnAssetImporter.UseCustomSettings to enable custom code generation per file, e.g. to isolate parts of the Qtn into libraries. See the class documentation for details and limitations
  • [CodeGen] Added QuantumCodeGenQtnSettings, which contains all settings of the Qtn codegen and can be edited in the Project Settings window. QuantumCodeGenSettings is obsolete
  • [Views] Added the ExponentialDecay interpolation mode for QuantumEntityView, a lightweight, frame-rate-independent smoothing that eases the Unity transform toward its target each frame instead of interpolating between simulation snapshots. It is the new default of InterpolationMode
  • [Views] Added QuantumEntityViewTransformHistory, a per-tick transform ring buffer per view that replaces the frame copies for view interpolation. It is exposed via QuantumEntityViewUpdater.TransformHistory and works without setting QuantumGameFlags.IsLegacyFrameCopiesEnabled
  • [Views] Added QuantumViewComponent.IsGameValid, TryGetPredictedFrame() and TryGetVerifiedFrame() to safely access the game and its frames from the Unity callbacks of view components
  • [Views] Added AddViewContext() and RemoveViewContext() to QuantumEntityViewUpdater to support alternative ways to register view contexts
  • [Views] Added QuantumEntityViewPool.IsBorrowed to check for pooled GameObjects
  • [Input] Added support for Unity InputSystem actions, which are now used by the demo Quantum input scripts and the Asteroids sample
  • [Online] Added a virtual Authenticate() method to QuantumStartUIConnection to quickly enable custom authentication
  • [Assets] Added support for the QuantumIgnore label. Assets with this label are ignored by QuantumUnityDB, e.g. prefabs that are used exclusively as map prototypes
  • [Assets] Added Asset Bundle support: QuantumUnityDB recognizes assets that can be loaded from Asset Bundles. Use the static delegates of QuantumAssetSourceAssetBundle to change how the bundles are loaded and unloaded, or define QUANTUM_DISABLE_ASSET_BUNDLE_ASSET_SOURCE to disable the feature
  • [Assets] Added QuantumUnityDBScope, an edit-time collection of AssetObjects that is fully decoupled from the global QuantumUnityDB, with the importer settings IncludeSubfolders, AssetBundles, ExplicitAssets and IsUnique and the Entries list. Apply a loaded scope at runtime with QuantumUnityDB.AddScope or TryAddScope; see also IsScopeLoaded and RemoveAllScopes
  • [Assets] Added ResourceManagerStatic.DisposeAllAssets() to unload all loaded assets; Dispose() only processes the disposals that are already scheduled
  • [Assets] Added QuantumGlobalScriptableObjectUtils.TryImportGlobal
  • [Profiling] Upgraded the graph profilers to combine multiple metrics in one graph, to better analyze the general simulation performance and online play
  • [Profiling] Added Unity profiler counters such as Q Frames Verified, Q Frames Predicted and Q Simulation Time, which can be added to the Unity profiler windows as a custom profiler module
  • [Profiling] Added stats for the simulation time spent on predicted and verified frames (DeterministicStats.PredictionTime and VerificationTime), and a Prediction statistic in the graph profilers and the QuantumStats window that shows how many ticks the simulation predicts
  • [Profiling] Added FrameCopyTime and FrameCopies to the simulation stats
  • [Profiling] Added the define QUANTUM_DISABLE_GRAPHPROFILER to remove the Quantum graph profiler code and reduce the build size
  • [Editor] Added QuantumEditorSettings.SdkRoot and QuantumEditorSettings.GetSdkPath(string relative). QuantumUnityEditorPaths is obsolete
  • [Editor] Added the define QUANTUM_DISABLE_HUB_POPUP to disable the Quantum Hub popup
  • [Editor] Added the Unity gizmo utility method GizmoUtils.DrawCylinder
  • [Editor] The Quantum gizmo toolbar hides unused module scopes (e.g. physics, navmesh), which can also be deactivated with the defines QUANTUM_DISABLE_PHYSICS_GIZMOS and QUANTUM_DISABLE_NAVMESH_GIZMOS. Its popups can be customized via CreateStylePopupContent()
  • [Editor] Added more Quantum options to the Unity 6 toolbar, including a button to open the Photon server settings. The Quantum open scene toolbar is back for Unity 6.3, using the official toolbar API
  • [Editor] Added support for the automatic statics cleanup of Unity 6.5: SDK statics are marked with [AutoStaticsCleanup] or [NoAutoStaticsCleanup]. On older Unity versions, generated code resets the same fields during SubsystemRegistration
  • [Editor] Added agent-friendly documentation (AGENTS.md and the manual as markdown). It is installed automatically with the Quantum user files (also for UPMs) or manually via the Quantum Hub or in batch mode with Quantum.Editor.QuantumDocumentation.Install
  • [Testing] Added Quantum.Testing.FrameEmulator, a testing harness that steps a single verified frame without a session, runner or QuantumGame
  • [Testing] Added the sample Edit Mode test projects Quantum.Simulation.Tests and Asteroids.Unity.Tests. The .NET project export (Generate Dotnet Project) also creates the NUnit project Quantum.Simulation.Dotnet.Tests to run the simulation tests with dotnet test
  • [Server] Added ServerSessionFactory and ServerSharedResources (Simulation/Server), the default implementations of IDeterministicSessionFactory and IDeterministicSharedResources used by custom server plugins
  • [Server] Experimental: a custom SessionRunner.Arguments.SnapshotProvider can create buddy snapshots on a background thread. This is only advised when the FrameContext is not changed
  • [Serialization] Added a typeResolver constructor parameter to QuantumJsonSerializer to allow custom type resolution in standalone runners
  • [Serialization] Added Quantum.Compression, an abstract base class for compression algorithms with two implementations: CompressionDotNet (default) and CompressionSharpLibZib (enabled when the com.unity.sharp-zip-lib package is installed). The latter can help with "Runtime Speed with LTO" issues in Web builds. Both implementations use the GZip format and produce the same results
  • [Replays] Quantum instant replays now also work when activated during a replay

Improvements

  • [Physics] Performance improved significantly across 2D and 3D Physics engines
  • [Physics] All 3D joint types now support warm-start, which improves their stability
  • [Physics] Improved the 2D and 3D joint position solvers to better solve complex constraint systems
  • [Physics] Physics bodies awakened by dynamic collisions now wake up other sleeping bodies of the same collision island in the same frame, so wake-ups no longer take multiple frames to propagate when the collision is not persistent
  • [Physics] Improved the accuracy of 2D and 3D shape casts in some scenarios
  • [Math] The fixed-point math is more accurate (most trig, exp and log functions are within one or two raw units) and compiles with Burst. The vector, quaternion and matrix math is tuned to be inlined by IL2CPP
  • [Math] Improved the accuracy of many FPVector2, FPVector3 and FPQuaternion methods by reducing rounding errors, significantly so for FPVector2.Angle and FPVector3.Angle in some cases, and added AngleSkipNormalize
  • [Memory] The frame heap supports blocks larger than the page size and allocates additional memory segments when it runs out. A new block-based heap variant (selected in the SimulationConfig) can lower fragmentation, and sparse set component blocks use lazily allocated chunks, which greatly reduces the time of frame CopyFrom calls with many component types and entities
  • [NavMesh] Optimized the navmesh runtime performance
  • [Performance] Reduced garbage allocations in LocalInputProvider, QuantumStats (which also updates less often), the signal array initialization and a few internal Linq usages
  • [Serialization] Improved the deserialization performance of QuantumJsonSerializer
  • [Assets] AssetRef and AssetRef<T> now implement IComparable for their respective types
  • [Assets] Sped up the QuantumUnityDB reimport when QuantumEditorSettings.AssetSearchPaths contains no package paths
  • [Assets] Optimized QuantumMeshCollection by removing the read/write flag
  • [Editor] Improved the loading performance of the FrameDiffer window
  • [Editor] The warnings logged for degenerate triangles during QuantumStaticMeshCollider3D baking now include the name of the GameObject

Changes

  • [Core] The default simulation rate was increased from 60 Hz to 64 Hz (a power of two), so DeltaTime has no rounding error and physics calculations are more precise
  • [Core] The default heap management mode for migrating projects is now the new PageBased mode
  • [Core] Some QDictionary, QList and QHashSet methods are now readonly
  • [Core] ISignal interfaces and Quantum system classes use the parameter name frame instead of f
  • [Physics] A default Hit or Hit3D is no longer static, and its StaticColliderIndex is -1 until a static collider is set
  • [Physics] An entity that subscribes to collision callbacks from inside a physics callback now starts receiving them on the next tick instead of the same tick
  • [Physics] HitCollection and HitCollection3D support an initial capacity of 0. The physics Hit Collection Items setting is clamped to a minimum of 4, and allocating a hit collection with a negative capacity throws an ArgumentOutOfRangeException
  • [Physics] Physics broad-phase queries added after the physics system started no longer produce a valid PhysicsQueryRef and have no effect
  • [Physics] The 2D and 3D physics query APIs that receive an external hit collection now have an optional parameter to reset the collection before resolving the query (it used to be mandatory)
  • [Physics] The 3D physics CollisionSolver.Solve methods perform multiple solver iterations by default, unless specified otherwise
  • [Physics] CollisionChecks in the Physics2D and Physics3D namespaces are now static classes
  • [Physics] FPQuaternion.FromToRotation changed how it disambiguates the rotation between opposite from and to vectors, matching the Unity 6.5+ standard
  • [NavMesh] Changed the NavMesh API: Map.NavMeshLinks was renamed to Map.NavMeshAssets, and NavMeshAgentConfig.AutomaticTargetCorrection was removed; target correction is enabled when AutomaticTargetCorrectionRadius is greater than 0
  • [NavMesh] NavMeshPathfinder stores typed asset refs; the new Config and NavMesh properties replace the obsolete ConfigId and NavMeshGuid
  • [NavMesh] A NavMeshPathfinder added without a config is assigned the default NavMeshAgentConfig
  • [NavMesh] ColorRGBA(string), Map.Loaded() and NavMeshPathfinder.SetTarget() throw on invalid data instead of logging errors, and the LayerInfo constructor throws if a parameter is null
  • [CodeGen] An [Attribute] on a signal definition is now an error
  • [CodeGen] Prototype dictionaries use the generic DictionaryEntry<K,V> instead of closed entry types
  • [CodeGen] Components marked with [CodeGen(PartialMonoBehaviour)] (or the legacy [CodeGen(NotMainUnityWrapper)]) generate their partial MonoBehaviours into the single file Quantum.CodeGen.UnityPartialMonoBehaviours.cs instead of one .Partial.cs file per component. [CodeGen(NoUnityPrototypeWrapper)] and [CodeGen(NotMainUnityWrapper)] are obsolete; use [CodeGen(NoMonoBehaviour)] and [CodeGen(PartialMonoBehaviour)] instead
  • [CodeGen] GeneratorOptions.NewLine is now an enum (was: string)
  • [CodeGen] Imported components no longer need their size specified, as long as they are not used as fields in other components or structs; import component Foo; is now valid
  • [CodeGen] The generated method EnsureNotStripped was renamed to EnsureNotStrippedGen; it is still not meant to be called directly
  • [CodeGen] The output for FrameEvents, FrameSignals and Statics changed to support modules
  • [Views] Entity view destruction is deferred until after the events are raised, so events created during entity destruction still see the entity view in their callbacks
  • [Unity] QuantumCallbackHandler_UnityCallbacks.LoadAddressableScenePathsAsync is now static
  • [Unity] Quantum no longer requires the com.unity.ugui package; removing it disables the start UI and the graph profilers
  • [Unity] JsonUtilityExtensions.InstanceIDHandlerDelegate now uses EntityId for Unity 6000.3+
  • [Assets] QuantumUnityDB no longer throws exceptions in the TryGet* methods if the DB failed to load
  • [Assets] Adding a scope to QuantumUnityDB logs a warning instead of throwing an exception if an asset can't be added due to a GUID or path conflict
  • [Assets] QuantumUnityDB.ScopeContext appends the AssetBundle variant, if present, to the output bundle name
  • [Assets] Both DynamicAssetDB.AddAsset overloads allow the asset to already have a GUID assigned, as long as it is of the DynamicExplicit type
  • [Assets] The AssetGuidOverrideDependency is updated when QuantumEditorSettings is saved. The overrides live outside the AssetDatabase and refresh their dependency separately from the asset hash dependency
  • [Assets] The QuantumStaticColliderSettings fields of the concrete static collider components were moved to their base classes QuantumStaticCollider2D/3DSource, and QuantumStaticColliderSettings.Asset was renamed to UserAsset
  • [Assets] QuantumMapData is now partial, so it can be extended more easily
  • [Assets] Changed the signature of UpdateManagedReferenceIds() to make it less specific
  • [Assets] MapEntityId.SceneIndexPlusOne is obsolete; use MapEntityId.RawValue instead
  • [Snapshots] Renamed QuantumGame.CreateSavegame() to GetSnapshotFile(), retired the QuantumRunnerLocalSavegame.cs script and merged its functionality into QuantumRunnerLocalDebug.cs
  • [Replays] Exporting replays and snapshots via the menu now saves the last save location as a relative path, and the export menu options have more meaningful descriptions
  • [Replays] The instant replay script now reuses its runner for consecutive replays
  • [Replays] BitStreamReplayInputProvider.Stream and MaxFrame are now public, so the class can be reused to run a replay with chunked input history
  • [Serialization] The ByteUtils compression methods are obsolete; use Quantum.Compression instead
  • [Server] Renamed DotNetSessionContext to ServerSessionContext and DotNetSessionRunner to ServerSessionRunner. IDeterministicSessionContext.Init() was removed: the asset database is loaded once by IDeterministicSharedResources, the asset serializer is passed with the start arguments and IDeterministicSessionContext.ResourceManager is now of type ResourceManagerStatic
  • [Realtime] Upgraded Photon Realtime to version 5.1.21
  • [Runner] Fixed a typo in QuantumRunnerUnityFactory.CreatePlatformInfo and changed the static method to a property
  • [Profiling] Stats in the QuantumStats window (like bandwidth) are now smoothed and show a 1-second average to make them more readable
  • [Profiling] Renamed and shortened the Quantum profiler marker names
  • [Profiling] Moved all GraphProfiler files to the GraphProfiler subfolder
  • [Editor] The gizmo toolbar header toggle no longer changes the state of each gizmo
  • [Editor] Gizmo shape rendering with QUANTUM_DRAW_SHAPES is only enabled in development builds
  • [Editor] QuantumStateInspector logs a warning if a debug command could not be sent
  • [Editor] Replaced the ShowAfter flags of the QuantumDotnetBuildSettings inspector with buttons that open the folder and the solutions directly
  • [Editor] The Quantum local UPM conversion now places the packages in the Packages folder
  • [Editor] Updated the custom plugin inspector

Removed

  • Moved the multi-client scripts out of the SDK package into a .unitypackage (Assets/Photon/Quantum/PackageResources/Quantum-MultiClient)
  • Removed the soon-to-be-deprecated DEVELOPMENT_BUILD define
  • Removed the SerializableEnterRoomArgs class
  • Removed the legacy SessionContainer class
  • Removed the StartWithFrame() method from QuantumRunnerLocalDebug
  • DeterministicFrameSerializeMode is obsolete; remove the mode parameter from Frame.Serialize() calls
  • Removed Assets/Photon/Quantum/Simulation/Core/Addons.T4.tt and QuantumEditorConfig.editorconfig from the SDK; delete them manually in migrating projects

Last updated on

Back to top