Release Notes 3.1
3.1.0
RC
Breaking Changes
- [Packaging]
Quantum.Deterministic.dllwas merged intoQuantum.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, assemblyQuantum.Realtime). Its scripts were merged and have new script GUIDs. DeleteAssets/Photon/PhotonRealtimeandAssets/Photon/PhotonLibsby hand and add the referenceGUID:73202fbdf404a7c438fa1b7b7d5c6957(Quantum.Realtime) to custom asmdefs that reference Photon Realtime. To use Photon Realtime from its own UPM package instead, defineQUANTUM_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_winwas removed from the plugin SDK search path - [Packaging]
Quantum.Profiling.HostProfilerwas renamed toQuantum.HostProfiler - [Math] Lookup tables were removed from the SDK;
FPMathnow uses polynomials and other approximation methods. DeletePhoton/Quantum/Runtime/RuntimeAssets/LUT,QuantumLookupTables.csandQuantumUser/Resources/QuantumLookupTables.assetafter upgrading.FPLutis obsolete, and the spectator and console runner no longer have theLutProviderparameter, theLutFoldersetting or the LUT path argument - [CodeGen] The
Globalslayout changed. Re-run the Quantum CodeGen after upgrading - [CodeGen] Event IDs are no longer
constbut static properties, which reduces cascading code changes when events are added or removed. To revert to the old behavior, addConstEventIdstoLegacyCodeGenOptionsinProject 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 withQuantumGame.AddCommand(DeterministicCommand)and processed with an iterator:foreach (var command in frame.GetPlayerCommands<MyCommand>(player)) { } - [Simulation] The
FrameContextUserconstructor signature changed toFrameContextUser(Args args, IRuntimeConfig runtimeConfig); the runtime config is passed fromQuantumGame - [Simulation]
Frame.DeltaTimeis now derived fromFrame.GameTimeScaleat the start of each frame. SettingDeltaTimesetsGameTimeScaleinstead and takes effect from the next frame on. DisableSimulationConfig.GameTimeScaleAffectsDeltaTimeto keep the legacy behavior.FrameTimerseconds are converted with the simulation rate and no longer follow a modifiedFrame.DeltaTime; useGameTimerfor timers that pause or slow down - [Views]
QuantumGame.Frames.PredictedPreviousandPreviousUpdatePredictedare only separate frame copies whenQuantumGameFlags.IsLegacyFrameCopiesEnabledis set; otherwise they alias the Verified frame.QuantumGameFlags.DisableInterpolatableStates,DeterministicSessionArgs.DisableInterpolatableStatesandDeterministicSession.IsInterpolatableare obsolete and replaced byIsLegacyFrameCopiesEnabled, which has the inverted meaning and is off by default.QuantumEntityView.InterpolationModedefaults toExponentialDecay - [Views]
QuantumEntityView.Initialize()no longer takes theQuantumEntityViewUpdater. Set theSnapshotInterpolationTimerproperty instead - [Views]
onlyIfActiveAndEnabledforQuantumCallback.SubscribeandQuantumEvent.Subscribeis nowtrueby default, so events and callbacks are no longer raised for disabled and pooledGameObjectsand entity views. DefineQUANTUM_ENABLE_LEGACY_SUBSCRIBE_PARAMto restore the old behavior
What's New
- [ECS] Added
tablecomponents, an alternative to the sparse set ECS components that scales better. See the documentation for details - [ECS] Added a
Storagefield toSimulationConfig.Entities.ComponentTypeConfigurationto 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) outputsnullfor its pointer - [ECS] Added the
QList<T>.Iterator.CurrentPtrproperty to iterate a list by pointer without copying its entries - [ECS] Added compound prototypes: Quantum prefabs can have nested
QuantumEntityPrototypecomponents and are baked withEntityPrototype.Nestedset. The root entity of a materialized compound prototype gets the new built-inEntityGroupcomponent, which ties the lifetime of the nested entities to the root (seeFrameBase.GetEntityGroupIterator). Disable it withQuantumEntityPrototypeAssetObjectImporter.EnableNestedPrototypesor the defineQUANTUM_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
CallbackGameResultResponseto 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
CallbackBeforeSimulationStageandCallbackSimulationStageFinished, andCallbackSimulateFinishednow carries theSimulatorContext. 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. TheQuantumStartUIprefab includes it by default - [Simulation] Added game time:
Frame.GameTickis a tick counter advanced by the simulation that can be paused or slowed down withFrame.GameTimeScale, andGameTimeris 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 ignoresFrame.GameTimeScale - [Simulation] Added
FrameTimer.DurationandFrameTimer.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 theSimulationConfig - [Physics] Added the
SimulationConfig.Physics.Substepssetting (default 2), which repeats integration and constraint solving with a fraction of the delta time for more stable physics at lower simulation rates. The defaultSolverIterationswas lowered from 4 to 2 to keep the solver cost similar - [Physics] Added
SimulationConfig.Physics.ScaleSubstepsWithGameTimeScale(enabled by default) andMaxScaledSubsteps. Physics runs proportionally more substeps whenFrame.GameTimeScaleis 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.ComputeWorldInertiaTensorInverseto 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
CheckOverlapandCollisionChecks.Checkoverloads that check twoShape2DorShape3Dpointers with their transforms (including compound shapes, adding a hit to aHitCollectionfor each overlapping pair of primitive shapes), and a frame-less overload for 2D primitive shapes other than polygons - [Physics] Added 2D and 3D
PhysicsCollider.Createoverloads without a frame parameter for shapes other than compounds - [Physics] Added the static methods
PhysicsMaterialData.GetCombinedRestitutionandGetCombinedFrictionto get the combined settings of two interacting physics materials - [Physics] Added
PhysicsSceneSettings.DefaultPhysicsMaterialData, which is initialized from the Physics Material asset defined in theSimulationConfig - [Physics] Added the
InvokeSpeculativeCallbackssetting to theSimulationConfig(enabled by default), which allows CCD callbacks to be called even after the first non-trigger collision. Check this condition with theIsSpeculativeCcdCollisionproperty of the callback info structs - [Physics] Added the physics query option
QueryOption.SleepingOnly, which ignores awake bodies when combined with theHitDynamicsflag - [Physics]
Shape3D.GetLocalSupportnow supports capsule shapes - [Physics] Added the
CharacterJoint3Djoint type, useful for ragdolls and ball-and-socket constraints and configurable via thePhysicsJoint3Dcomponent prototype - [Physics] Added the
QuantumRagdollMonoBehaviour, 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 anAnimator. A template ragdoll can be created viaHierarchy>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.Assetis 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 aPhysicsMaterial.QuantumHeightMapprovides the FP heightmap storage and operations that used to be part of theTerrainColliderasset - [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.SerializeMutableDatato 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.AverageandFPVector3.Averageto 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()andNextUInt64() - [Math] Added the
FPMath.SortAPI for spans and buffers, using either a comparer delegate or a comparable field - [Math] Added static methods to get the rows or columns of
FPMatrix2x2andFPMatrix3x3 - [Math] Added index operators to
FPVector2,FPVector3,IntVector2andIntVector3to access their x, y and z components - [NavMesh] Added the
Heuristic Weightsetting toNavMeshAgentConfig, which can improve the performance of the A* algorithm; try setting it to1.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,#elseand#endifto.qtnfiles. The symbols come fromGeneratorOptions.Defines(NAMEorNAME=value; symbols with a value also become constants) - [CodeGen] Added the
signal structkeyword. The signal parameters are passed to systems as a generated{SignalName}Argsstruct (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.qtnfile with this pragma emits its output (components, prototypes, events etc.) to a set of module-specific.csfiles, which can be used to break apart the "core" module when it becomes too unwieldy - [CodeGen] Added access modifiers for fields and types;
publicis still the default - [CodeGen] Added
QuantumQtnAssetImporter.UseCustomSettingsto 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.QuantumCodeGenSettingsis obsolete - [Views] Added the
ExponentialDecayinterpolation mode forQuantumEntityView, 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 ofInterpolationMode - [Views] Added
QuantumEntityViewTransformHistory, a per-tick transform ring buffer per view that replaces the frame copies for view interpolation. It is exposed viaQuantumEntityViewUpdater.TransformHistoryand works without settingQuantumGameFlags.IsLegacyFrameCopiesEnabled - [Views] Added
QuantumViewComponent.IsGameValid,TryGetPredictedFrame()andTryGetVerifiedFrame()to safely access the game and its frames from the Unity callbacks of view components - [Views] Added
AddViewContext()andRemoveViewContext()toQuantumEntityViewUpdaterto support alternative ways to register view contexts - [Views] Added
QuantumEntityViewPool.IsBorrowedto check for pooledGameObjects - [Input] Added support for Unity
InputSystemactions, which are now used by the demo Quantum input scripts and the Asteroids sample - [Online] Added a virtual
Authenticate()method toQuantumStartUIConnectionto quickly enable custom authentication - [Assets] Added support for the
QuantumIgnorelabel. Assets with this label are ignored byQuantumUnityDB, e.g. prefabs that are used exclusively as map prototypes - [Assets] Added Asset Bundle support:
QuantumUnityDBrecognizes assets that can be loaded from Asset Bundles. Use the static delegates ofQuantumAssetSourceAssetBundleto change how the bundles are loaded and unloaded, or defineQUANTUM_DISABLE_ASSET_BUNDLE_ASSET_SOURCEto disable the feature - [Assets] Added
QuantumUnityDBScope, an edit-time collection ofAssetObjectsthat is fully decoupled from the globalQuantumUnityDB, with the importer settingsIncludeSubfolders,AssetBundles,ExplicitAssetsandIsUniqueand theEntrieslist. Apply a loaded scope at runtime withQuantumUnityDB.AddScopeorTryAddScope; see alsoIsScopeLoadedandRemoveAllScopes - [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 PredictedandQ 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.PredictionTimeandVerificationTime), and aPredictionstatistic in the graph profilers and theQuantumStatswindow that shows how many ticks the simulation predicts - [Profiling] Added
FrameCopyTimeandFrameCopiesto the simulation stats - [Profiling] Added the define
QUANTUM_DISABLE_GRAPHPROFILERto remove the Quantum graph profiler code and reduce the build size - [Editor] Added
QuantumEditorSettings.SdkRootandQuantumEditorSettings.GetSdkPath(string relative).QuantumUnityEditorPathsis obsolete - [Editor] Added the define
QUANTUM_DISABLE_HUB_POPUPto 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_GIZMOSandQUANTUM_DISABLE_NAVMESH_GIZMOS. Its popups can be customized viaCreateStylePopupContent() - [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 duringSubsystemRegistration - [Editor] Added agent-friendly documentation (
AGENTS.mdand 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 withQuantum.Editor.QuantumDocumentation.Install - [Testing] Added
Quantum.Testing.FrameEmulator, a testing harness that steps a single verified frame without a session, runner orQuantumGame - [Testing] Added the sample Edit Mode test projects
Quantum.Simulation.TestsandAsteroids.Unity.Tests. The .NET project export (Generate Dotnet Project) also creates the NUnit projectQuantum.Simulation.Dotnet.Teststo run the simulation tests withdotnet test - [Server] Added
ServerSessionFactoryandServerSharedResources(Simulation/Server), the default implementations ofIDeterministicSessionFactoryandIDeterministicSharedResourcesused by custom server plugins - [Server] Experimental: a custom
SessionRunner.Arguments.SnapshotProvidercan create buddy snapshots on a background thread. This is only advised when theFrameContextis not changed - [Serialization] Added a
typeResolverconstructor parameter toQuantumJsonSerializerto allow custom type resolution in standalone runners - [Serialization] Added
Quantum.Compression, an abstract base class for compression algorithms with two implementations:CompressionDotNet(default) andCompressionSharpLibZib(enabled when thecom.unity.sharp-zip-libpackage is installed). The latter can help with "Runtime Speed with LTO" issues in Web builds. Both implementations use theGZipformat 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,FPVector3andFPQuaternionmethods by reducing rounding errors, significantly so forFPVector2.AngleandFPVector3.Anglein some cases, and addedAngleSkipNormalize - [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 frameCopyFromcalls 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]
AssetRefandAssetRef<T>now implementIComparablefor their respective types - [Assets] Sped up the
QuantumUnityDBreimport whenQuantumEditorSettings.AssetSearchPathscontains no package paths - [Assets] Optimized
QuantumMeshCollectionby removing the read/write flag - [Editor] Improved the loading performance of the
FrameDifferwindow - [Editor] The warnings logged for degenerate triangles during
QuantumStaticMeshCollider3Dbaking now include the name of theGameObject
Changes
- [Core] The default simulation rate was increased from
60 Hzto64 Hz(a power of two), soDeltaTimehas no rounding error and physics calculations are more precise - [Core] The default heap management mode for migrating projects is now the new
PageBasedmode - [Core] Some
QDictionary,QListandQHashSetmethods are nowreadonly - [Core]
ISignalinterfaces and Quantum system classes use the parameter nameframeinstead off - [Physics] A default
HitorHit3Dis no longer static, and itsStaticColliderIndexis -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]
HitCollectionandHitCollection3Dsupport an initial capacity of 0. The physicsHit Collection Itemssetting is clamped to a minimum of 4, and allocating a hit collection with a negative capacity throws anArgumentOutOfRangeException - [Physics] Physics broad-phase queries added after the physics system started no longer produce a valid
PhysicsQueryRefand 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.Solvemethods perform multiple solver iterations by default, unless specified otherwise - [Physics]
CollisionChecksin thePhysics2DandPhysics3Dnamespaces are now static classes - [Physics]
FPQuaternion.FromToRotationchanged how it disambiguates the rotation between opposite from and to vectors, matching the Unity 6.5+ standard - [NavMesh] Changed the NavMesh API:
Map.NavMeshLinkswas renamed toMap.NavMeshAssets, andNavMeshAgentConfig.AutomaticTargetCorrectionwas removed; target correction is enabled whenAutomaticTargetCorrectionRadiusis greater than 0 - [NavMesh]
NavMeshPathfinderstores typed asset refs; the newConfigandNavMeshproperties replace the obsoleteConfigIdandNavMeshGuid - [NavMesh] A
NavMeshPathfinderadded without a config is assigned the defaultNavMeshAgentConfig - [NavMesh]
ColorRGBA(string),Map.Loaded()andNavMeshPathfinder.SetTarget()throw on invalid data instead of logging errors, and theLayerInfoconstructor throws if a parameter is null - [CodeGen] An
[Attribute]on asignaldefinition 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 partialMonoBehavioursinto the single fileQuantum.CodeGen.UnityPartialMonoBehaviours.csinstead of one.Partial.csfile per component.[CodeGen(NoUnityPrototypeWrapper)]and[CodeGen(NotMainUnityWrapper)]are obsolete; use[CodeGen(NoMonoBehaviour)]and[CodeGen(PartialMonoBehaviour)]instead - [CodeGen]
GeneratorOptions.NewLineis 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
EnsureNotStrippedwas renamed toEnsureNotStrippedGen; it is still not meant to be called directly - [CodeGen] The output for
FrameEvents,FrameSignalsandStaticschanged 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.LoadAddressableScenePathsAsyncis now static - [Unity] Quantum no longer requires the
com.unity.uguipackage; removing it disables the start UI and the graph profilers - [Unity]
JsonUtilityExtensions.InstanceIDHandlerDelegatenow usesEntityIdfor Unity 6000.3+ - [Assets]
QuantumUnityDBno longer throws exceptions in theTryGet*methods if the DB failed to load - [Assets] Adding a scope to
QuantumUnityDBlogs a warning instead of throwing an exception if an asset can't be added due to a GUID or path conflict - [Assets]
QuantumUnityDB.ScopeContextappends theAssetBundlevariant, if present, to the output bundle name - [Assets] Both
DynamicAssetDB.AddAssetoverloads allow the asset to already have a GUID assigned, as long as it is of theDynamicExplicittype - [Assets] The
AssetGuidOverrideDependencyis updated whenQuantumEditorSettingsis saved. The overrides live outside theAssetDatabaseand refresh their dependency separately from the asset hash dependency - [Assets] The
QuantumStaticColliderSettingsfields of the concrete static collider components were moved to their base classesQuantumStaticCollider2D/3DSource, andQuantumStaticColliderSettings.Assetwas renamed toUserAsset - [Assets]
QuantumMapDatais now partial, so it can be extended more easily - [Assets] Changed the signature of
UpdateManagedReferenceIds()to make it less specific - [Assets]
MapEntityId.SceneIndexPlusOneis obsolete; useMapEntityId.RawValueinstead - [Snapshots] Renamed
QuantumGame.CreateSavegame()toGetSnapshotFile(), retired theQuantumRunnerLocalSavegame.csscript and merged its functionality intoQuantumRunnerLocalDebug.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.StreamandMaxFrameare now public, so the class can be reused to run a replay with chunked input history - [Serialization] The
ByteUtilscompression methods are obsolete; useQuantum.Compressioninstead - [Server] Renamed
DotNetSessionContexttoServerSessionContextandDotNetSessionRunnertoServerSessionRunner.IDeterministicSessionContext.Init()was removed: the asset database is loaded once byIDeterministicSharedResources, the asset serializer is passed with the start arguments andIDeterministicSessionContext.ResourceManageris now of typeResourceManagerStatic - [Realtime] Upgraded Photon Realtime to version
5.1.21 - [Runner] Fixed a typo in
QuantumRunnerUnityFactory.CreatePlatformInfoand changed the static method to a property - [Profiling] Stats in the
QuantumStatswindow (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
GraphProfilerfiles to theGraphProfilersubfolder - [Editor] The gizmo toolbar header toggle no longer changes the state of each gizmo
- [Editor] Gizmo shape rendering with
QUANTUM_DRAW_SHAPESis only enabled in development builds - [Editor]
QuantumStateInspectorlogs a warning if a debug command could not be sent - [Editor] Replaced the
ShowAfterflags of theQuantumDotnetBuildSettingsinspector with buttons that open the folder and the solutions directly - [Editor] The Quantum local UPM conversion now places the packages in the
Packagesfolder - [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_BUILDdefine - Removed the
SerializableEnterRoomArgsclass - Removed the legacy
SessionContainerclass - Removed the
StartWithFrame()method fromQuantumRunnerLocalDebug DeterministicFrameSerializeModeis obsolete; remove the mode parameter fromFrame.Serialize()calls- Removed
Assets/Photon/Quantum/Simulation/Core/Addons.T4.ttandQuantumEditorConfig.editorconfigfrom the SDK; delete them manually in migrating projects
Last updated on
Back to top