Release Notes
3.0.0
Preview
Build 2597 (Jul 01, 2026)
Breaking Changes
- Namespace PhotonCommon::detail was renamed to PhotonCommon::Detail
- PhotonCommon::detail::is_result was renamed to PhotonCommon::Detail::IsResult
- PhotonCommon::detail::is_task was renamed to PhotonCommon::Detail::IsTask
- PhotonCommon::detail::unwrap_task was renamed to PhotonCommon::Detail::UnwrapTask
- FusionCore::MasterClientPlayerId was renamed to FusionCore::MASTER_CLIENT_PLAYER_ID
- FusionCore::PluginPlayerId was renamed to FusionCore::PLUGIN_PLAYER_ID
- FusionCore::ObjectOwnerPlayerId was renamed to FusionCore::OBJECT_OWNED_PLAYER_ID
- FusionCore::ObjectId::WordSize was renamed to FusionCore::ObjectId::WORD_SIZE
- FusionCore::RPC_InternalMinId was renamed to FusionCore::RPC_INTERNAL_MIN_ID
- FusionCore::RPC_InternalMaxId was renamed to FusionCore::RPC_INTERNAL_MAX_ID
- FusionCore::RPC_InternalMapChange was renamed to FusionCore::RPC_INTERNAL_MAP_CHANGE
- FusionCore::RPC_InternalObjectPriority was renamed to FusionCore::RPC_INTERNAL_OBJECT_PRIORITY
- FusionCore::RPC_InternalMapAdd was renamed to FusionCore::RPC_INTERNAL_MAP_ADD
- FusionCore::RPC_InternalMapRemove was renamed to FusionCore::RPC_INTERNAL_MAP_REMOVE
- FusionCore::RPC_InternalOwnershipRequest was renamed to FusionCore::RPC_INTERNAL_OWNERSHIP_REQUEST
- FusionCore::RPC_InternalRejectSubObject was renamed to FusionCore::RPC_INTERNAL_REJECT_SUB_OBJECT
- FusionCore::RPC_InternalDestroyedMapActors was renamed to FusionCore::RPC_INTERNAL_DESTROYED_MAP_ACTORS
- FusionCore::RPC_InternalForceDestroyObject was renamed to FusionCore::RPC_INTERNAL_FORCE_DESTROY_OBJECT
- FusionCore::RPC_InternalForceAliveObject was renamed to FusionCore::RPC_INTERNAL_FORCE_ALIVE_OBJECT
- FusionCore::RPC_InternalInput was renamed to FusionCore::RPC_INTERNAL_INPUT
- FusionCore::RPC_InternalPlayerInterest was renamed to FusionCore::RPC_INTERNAL_PLAYER_INTEREST
- FusionCore::RPC_InternalOwnershipResponse was renamed to FusionCore::RPC_INTERNAL_OWNERSHIP_RESPONSE
- FusionCore::Object::ExtraTailWords was renamed to FusionCore::Object::EXTRA_TAIL_WORDS
- FusionCore::WordData::offset was renamed to FusionCore::WordData::Offset
- FusionCore::WordData::value was renamed to FusionCore::WordData::Value
- FusionCore::SdkVersion::_packed was renamed to FusionCore::SdkVersion::Packed
- FusionCore::WriteFlags::buffer was renamed to FusionCore::WriteFlags::Buffer
- FusionCore::WriteFlags::offset was renamed to FusionCore::WriteFlags::Offset
- FusionCore::Notify::FragmentHeader::_reserved_1 was renamed to FusionCore::Notify::FragmentHeader::Reserved1
- FusionCore::FusionRoomProperties::Config was renamed to FusionCore::FusionRoomProperties::CONFIG
- FusionCore::FusionRoomProperties::MapData was renamed to FusionCore::FusionRoomProperties::MAP_DATA
- FusionCore::FusionRoomProperties::SdkVersion was renamed to FusionCore::FusionRoomProperties::SDK_VERSION
- FusionCore::FusionConfigDefaults::Json was renamed to FusionCore::FusionConfigDefaults::JSON
- PhotonCommon::Error::code was renamed to PhotonCommon::Error::Code
- PhotonCommon::Error::message was renamed to PhotonCommon::Error::Message
- PhotonCommon::detail::is_result_v was renamed to PhotonCommon::Detail::IS_RESULT_V
- PhotonCommon::detail::is_task_v was renamed to PhotonCommon::Detail::IS_TASK_V
- PhotonCommon::Task::promise_type::result was renamed to PhotonCommon::Task::promise_type::Result
- PhotonCommon::Task::promise_type::exception was renamed to PhotonCommon::Task::promise_type::Exception
- PhotonCommon::Task::promise_type::continuation was renamed to PhotonCommon::Task::promise_type::Continuation
- PhotonCommon::Task::promise_type::detached was renamed to PhotonCommon::Task::promise_type::Detached
- PhotonMatchmaking::AuthenticationValues::userId was renamed to PhotonMatchmaking::AuthenticationValues::UserId
- PhotonMatchmaking::AuthenticationValues::type was renamed to PhotonMatchmaking::AuthenticationValues::Type
- PhotonMatchmaking::AuthenticationValues::parameters was renamed to PhotonMatchmaking::AuthenticationValues::Parameters
- PhotonMatchmaking::AuthenticationValues::data was renamed to PhotonMatchmaking::AuthenticationValues::Data
- PhotonMatchmaking::ClientConstructOptions::appId was renamed to PhotonMatchmaking::ClientConstructOptions::AppId
- PhotonMatchmaking::ClientConstructOptions::appVersion was renamed to PhotonMatchmaking::ClientConstructOptions::AppVersion
- PhotonMatchmaking::ClientConstructOptions::protocol was renamed to PhotonMatchmaking::ClientConstructOptions::Protocol
- PhotonMatchmaking::ClientConstructOptions::useAlternativePorts was renamed to PhotonMatchmaking::ClientConstructOptions::UseAlternativePorts
- PhotonMatchmaking::ClientConstructOptions::regionSelectionMode was renamed to PhotonMatchmaking::ClientConstructOptions::RegionSelectionMode
- PhotonMatchmaking::ClientConstructOptions::autoLobbyStats was renamed to PhotonMatchmaking::ClientConstructOptions::AutoLobbyStats
- PhotonMatchmaking::ClientConstructOptions::serialization was renamed to PhotonMatchmaking::ClientConstructOptions::Serialization
- PhotonMatchmaking::ClientConstructOptions::disconnectTimeoutMs was renamed to PhotonMatchmaking::ClientConstructOptions::DisconnectTimeoutMs
- PhotonMatchmaking::ClientConstructOptions::pingIntervalMs was renamed to PhotonMatchmaking::ClientConstructOptions::PingIntervalMs
- PhotonMatchmaking::ClientConstructOptions::enableCrc was renamed to PhotonMatchmaking::ClientConstructOptions::EnableCrc
- PhotonMatchmaking::ClientConstructOptions::sentCountAllowance was renamed to PhotonMatchmaking::ClientConstructOptions::SentCountAllowance
- PhotonMatchmaking::ClientConstructOptions::quickResendAttempts was renamed to PhotonMatchmaking::ClientConstructOptions::QuickResendAttempts
- PhotonMatchmaking::ClientConstructOptions::limitOfUnreliableCommands was renamed to PhotonMatchmaking::ClientConstructOptions::LimitOfUnreliableCommands
- PhotonMatchmaking::ConnectOptions::auth was renamed to PhotonMatchmaking::ConnectOptions::Auth
- PhotonMatchmaking::ConnectOptions::username was renamed to PhotonMatchmaking::ConnectOptions::Username
- PhotonMatchmaking::ConnectOptions::serverType was renamed to PhotonMatchmaking::ConnectOptions::ServerType
- PhotonMatchmaking::ConnectOptions::serverAddress was renamed to PhotonMatchmaking::ConnectOptions::ServerAddress
- PhotonMatchmaking::ConnectOptions::tryUseDatagramEncryption was renamed to PhotonMatchmaking::ConnectOptions::TryUseDatagramEncryption
- PhotonMatchmaking::ConnectOptions::useBackgroundSendReceiveThread was renamed to PhotonMatchmaking::ConnectOptions::UseBackgroundSendReceiveThread
- PhotonMatchmaking::CreateRoomOptions::isVisible was renamed to PhotonMatchmaking::CreateRoomOptions::IsVisible
- PhotonMatchmaking::CreateRoomOptions::isOpen was renamed to PhotonMatchmaking::CreateRoomOptions::IsOpen
- PhotonMatchmaking::CreateRoomOptions::maxPlayers was renamed to PhotonMatchmaking::CreateRoomOptions::MaxPlayers
- PhotonMatchmaking::CreateRoomOptions::customProperties was renamed to PhotonMatchmaking::CreateRoomOptions::CustomProperties
- PhotonMatchmaking::CreateRoomOptions::lobbyProperties was renamed to PhotonMatchmaking::CreateRoomOptions::LobbyProperties
- PhotonMatchmaking::CreateRoomOptions::lobbyName was renamed to PhotonMatchmaking::CreateRoomOptions::LobbyName
- PhotonMatchmaking::CreateRoomOptions::lobbyType was renamed to PhotonMatchmaking::CreateRoomOptions::LobbyType
- PhotonMatchmaking::CreateRoomOptions::playerTtlMs was renamed to PhotonMatchmaking::CreateRoomOptions::PlayerTtlMs
- PhotonMatchmaking::CreateRoomOptions::emptyRoomTtlMs was renamed to PhotonMatchmaking::CreateRoomOptions::EmptyRoomTtlMs
- PhotonMatchmaking::CreateRoomOptions::suppressRoomEvents was renamed to PhotonMatchmaking::CreateRoomOptions::SuppressRoomEvents
- PhotonMatchmaking::CreateRoomOptions::publishUserId was renamed to PhotonMatchmaking::CreateRoomOptions::PublishUserId
- PhotonMatchmaking::CreateRoomOptions::directMode was renamed to PhotonMatchmaking::CreateRoomOptions::DirectMode
- PhotonMatchmaking::CreateRoomOptions::plugins was renamed to PhotonMatchmaking::CreateRoomOptions::Plugins
- PhotonMatchmaking::CreateRoomOptions::expectedUsers was renamed to PhotonMatchmaking::CreateRoomOptions::ExpectedUsers
- PhotonMatchmaking::DirectMessageOptions::targetPlayers was renamed to PhotonMatchmaking::DirectMessageOptions::TargetPlayers
- PhotonMatchmaking::DirectMessageOptions::receiverGroup was renamed to PhotonMatchmaking::DirectMessageOptions::ReceiverGroup
- PhotonMatchmaking::DirectMessageOptions::fallbackRelay was renamed to PhotonMatchmaking::DirectMessageOptions::FallbackRelay
- PhotonMatchmaking::EventOptions::reliable was renamed to PhotonMatchmaking::EventOptions::Reliable
- PhotonMatchmaking::EventOptions::channel was renamed to PhotonMatchmaking::EventOptions::Channel
- PhotonMatchmaking::EventOptions::receiverGroup was renamed to PhotonMatchmaking::EventOptions::ReceiverGroup
- PhotonMatchmaking::EventOptions::targetPlayers was renamed to PhotonMatchmaking::EventOptions::TargetPlayers
- PhotonMatchmaking::EventOptions::interestGroup was renamed to PhotonMatchmaking::EventOptions::InterestGroup
- PhotonMatchmaking::EventOptions::caching was renamed to PhotonMatchmaking::EventOptions::Caching
- PhotonMatchmaking::EventOptions::encrypt was renamed to PhotonMatchmaking::EventOptions::Encrypt
- PhotonMatchmaking::EventOptions::cacheSliceIndex was renamed to PhotonMatchmaking::EventOptions::CacheSliceIndex
- PhotonMatchmaking::EventOptions::webFlags was renamed to PhotonMatchmaking::EventOptions::WebFlags
- PhotonMatchmaking::Friend
- PhotonMatchmaking::JoinRoomOptions::rejoin was renamed to PhotonMatchmaking::JoinRoomOptions::Rejoin
- PhotonMatchmaking::JoinRoomOptions::cacheSliceIndex was renamed to PhotonMatchmaking::JoinRoomOptions::CacheSliceIndex
- PhotonMatchmaking::JoinRoomOptions::expectedUsers was renamed to PhotonMatchmaking::JoinRoomOptions::ExpectedUsers
- PhotonMatchmaking::LobbyStats::name was renamed to PhotonMatchmaking::LobbyStats::Name
- PhotonMatchmaking::LobbyStats::type was renamed to PhotonMatchmaking::LobbyStats::Type
- PhotonMatchmaking::LobbyStats::peerCount was renamed to PhotonMatchmaking::LobbyStats::PeerCount
- PhotonMatchmaking::LobbyStats::roomCount was renamed to PhotonMatchmaking::LobbyStats::RoomCount
- PhotonMatchmaking::MatchmakingOptions::filter was renamed to PhotonMatchmaking::MatchmakingOptions::Filter
- PhotonMatchmaking::MatchmakingOptions::maxPlayers was renamed to PhotonMatchmaking::MatchmakingOptions::MaxPlayers
- PhotonMatchmaking::MatchmakingOptions::mode was renamed to PhotonMatchmaking::MatchmakingOptions::Mode
- PhotonMatchmaking::MatchmakingOptions::lobbyName was renamed to PhotonMatchmaking::MatchmakingOptions::LobbyName
- PhotonMatchmaking::MatchmakingOptions::lobbyType was renamed to PhotonMatchmaking::MatchmakingOptions::LobbyType
- PhotonMatchmaking::MatchmakingOptions::sqlFilter was renamed to PhotonMatchmaking::MatchmakingOptions::SqlFilter
- PhotonMatchmaking::MatchmakingOptions::expectedUsers was renamed to PhotonMatchmaking::MatchmakingOptions::ExpectedUsers
- PhotonMatchmaking::NetworkStats::roundTripTimeMs was renamed to PhotonMatchmaking::NetworkStats::RoundTripTimeMs
- PhotonMatchmaking::NetworkStats::rttVarianceMs was renamed to PhotonMatchmaking::NetworkStats::RttVarianceMs
- PhotonMatchmaking::NetworkStats::bytesIn was renamed to PhotonMatchmaking::NetworkStats::BytesIn
- PhotonMatchmaking::NetworkStats::bytesOut was renamed to PhotonMatchmaking::NetworkStats::BytesOut
- PhotonMatchmaking::NetworkStats::bytesCurrentDispatch was renamed to PhotonMatchmaking::NetworkStats::BytesCurrentDispatch
- PhotonMatchmaking::NetworkStats::bytesLastOperation was renamed to PhotonMatchmaking::NetworkStats::BytesLastOperation
- PhotonMatchmaking::NetworkStats::queuedIncomingCommands was renamed to PhotonMatchmaking::NetworkStats::QueuedIncomingCommands
- PhotonMatchmaking::NetworkStats::queuedOutgoingCommands was renamed to PhotonMatchmaking::NetworkStats::QueuedOutgoingCommands
- PhotonMatchmaking::NetworkStats::incomingReliableCommands was renamed to PhotonMatchmaking::NetworkStats::IncomingReliableCommands
- PhotonMatchmaking::NetworkStats::resentReliableCommands was renamed to PhotonMatchmaking::NetworkStats::ResentReliableCommands
- PhotonMatchmaking::NetworkStats::playersInGame was renamed to PhotonMatchmaking::NetworkStats::PlayersInGame
- PhotonMatchmaking::NetworkStats::gamesRunning was renamed to PhotonMatchmaking::NetworkStats::GamesRunning
- PhotonMatchmaking::NetworkStats::playersOnline was renamed to PhotonMatchmaking::NetworkStats::PlayersOnline
- PhotonMatchmaking::NetworkStats::serverTimeOffsetMs was renamed to PhotonMatchmaking::NetworkStats::ServerTimeOffsetMs
- PhotonMatchmaking::NetworkStats::serverTimeMs was renamed to PhotonMatchmaking::NetworkStats::ServerTimeMs
- PhotonMatchmaking::NetworkStats::timestampLastReceive was renamed to PhotonMatchmaking::NetworkStats::TimestampLastReceive
- PhotonMatchmaking::NetworkStats::packetLossByCrc was renamed to PhotonMatchmaking::NetworkStats::PacketLossByCrc
- PhotonMatchmaking::NetworkStats::sentCountAllowance was renamed to PhotonMatchmaking::NetworkStats::SentCountAllowance
- PhotonMatchmaking::NetworkStats::encryptionAvailable was renamed to PhotonMatchmaking::NetworkStats::EncryptionAvailable
- PhotonMatchmaking::NetworkStats::payloadEncryptionAvailable was renamed to PhotonMatchmaking::NetworkStats::PayloadEncryptionAvailable
- PhotonMatchmaking::NetworkStats::peerId was renamed to PhotonMatchmaking::NetworkStats::PeerId
- PhotonMatchmaking::NetworkStats::disconnectTimeoutMs was renamed to PhotonMatchmaking::NetworkStats::DisconnectTimeoutMs
- PhotonMatchmaking::NetworkStats::pingIntervalMs was renamed to PhotonMatchmaking::NetworkStats::PingIntervalMs
- PhotonMatchmaking::NetworkStats::trafficStatsElapsedMs was renamed to PhotonMatchmaking::NetworkStats::TrafficStatsElapsedMs
- PhotonMatchmaking::NetworkStats::masterServerAddress was renamed to PhotonMatchmaking::NetworkStats::MasterServerAddress
- PhotonMatchmaking::NetworkStats::channelCountUserChannels was renamed to PhotonMatchmaking::NetworkStats::ChannelCountUserChannels
- PhotonMatchmaking::NetworkStats::serializationProtocol was renamed to PhotonMatchmaking::NetworkStats::SerializationProtocol
- PhotonMatchmaking::NetworkStats::peerCount was renamed to PhotonMatchmaking::NetworkStats::PeerCount
- PhotonMatchmaking::PlayerView::number was renamed to PhotonMatchmaking::PlayerView::Number
- PhotonMatchmaking::PlayerView::name was renamed to PhotonMatchmaking::PlayerView::Name
- PhotonMatchmaking::PlayerView::userId was renamed to PhotonMatchmaking::PlayerView::UserId
- PhotonMatchmaking::PlayerView::customProperties was renamed to PhotonMatchmaking::PlayerView::CustomProperties
- PhotonMatchmaking::PlayerView::isInactive was renamed to PhotonMatchmaking::PlayerView::IsInactive
- PhotonMatchmaking::PlayerView::isMasterClient was renamed to PhotonMatchmaking::PlayerView::IsMasterClient
- PhotonMatchmaking::Region
- PhotonMatchmaking::RoomListing::name was renamed to PhotonMatchmaking::RoomListing::Name
- PhotonMatchmaking::RoomListing::playerCount was renamed to PhotonMatchmaking::RoomListing::PlayerCount
- PhotonMatchmaking::RoomListing::maxPlayers was renamed to PhotonMatchmaking::RoomListing::MaxPlayers
- PhotonMatchmaking::RoomListing::isOpen was renamed to PhotonMatchmaking::RoomListing::IsOpen
- PhotonMatchmaking::RoomListing::directMode was renamed to PhotonMatchmaking::RoomListing::DirectMode
- PhotonMatchmaking::RoomListing::customProperties was renamed to PhotonMatchmaking::RoomListing::CustomProperties
- PhotonMatchmaking::TrafficStats::packageHeaderSize was renamed to PhotonMatchmaking::TrafficStats::PackageHeaderSize
- PhotonMatchmaking::TrafficStats::reliableCommandCount was renamed to PhotonMatchmaking::TrafficStats::ReliableCommandCount
- PhotonMatchmaking::TrafficStats::unreliableCommandCount was renamed to PhotonMatchmaking::TrafficStats::UnreliableCommandCount
- PhotonMatchmaking::TrafficStats::fragmentCommandCount was renamed to PhotonMatchmaking::TrafficStats::FragmentCommandCount
- PhotonMatchmaking::TrafficStats::controlCommandCount was renamed to PhotonMatchmaking::TrafficStats::ControlCommandCount
- PhotonMatchmaking::TrafficStats::totalPacketCount was renamed to PhotonMatchmaking::TrafficStats::TotalPacketCount
- PhotonMatchmaking::TrafficStats::totalCommandsInPackets was renamed to PhotonMatchmaking::TrafficStats::TotalCommandsInPackets
- PhotonMatchmaking::TrafficStats::reliableCommandBytes was renamed to PhotonMatchmaking::TrafficStats::ReliableCommandBytes
- PhotonMatchmaking::TrafficStats::unreliableCommandBytes was renamed to PhotonMatchmaking::TrafficStats::UnreliableCommandBytes
- PhotonMatchmaking::TrafficStats::fragmentCommandBytes was renamed to PhotonMatchmaking::TrafficStats::FragmentCommandBytes
- PhotonMatchmaking::TrafficStats::controlCommandBytes was renamed to PhotonMatchmaking::TrafficStats::ControlCommandBytes
- PhotonMatchmaking::TrafficStats::totalCommandCount was renamed to PhotonMatchmaking::TrafficStats::TotalCommandCount
- PhotonMatchmaking::TrafficStats::totalCommandBytes was renamed to PhotonMatchmaking::TrafficStats::TotalCommandBytes
- PhotonMatchmaking::TrafficStats::totalPacketBytes was renamed to PhotonMatchmaking::TrafficStats::TotalPacketBytes
- PhotonMatchmaking::TrafficStats::timestampOfLastAck was renamed to PhotonMatchmaking::TrafficStats::TimestampOfLastAck
- PhotonMatchmaking::TrafficStats::timestampOfLastReliableCommand was renamed to PhotonMatchmaking::TrafficStats::TimestampOfLastReliableCommand
- PhotonMatchmaking::TrafficStatsGameLevel::operationByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::OperationByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::operationCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::OperationCount
- PhotonMatchmaking::TrafficStatsGameLevel::resultByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::ResultByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::resultCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::ResultCount
- PhotonMatchmaking::TrafficStatsGameLevel::eventByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::EventByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::eventCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::EventCount
- PhotonMatchmaking::TrafficStatsGameLevel::longestOpResponseCallbackMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestOpResponseCallbackMs
- PhotonMatchmaking::TrafficStatsGameLevel::longestOpResponseCallbackOpCode was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestOpResponseCallbackOpCode
- PhotonMatchmaking::TrafficStatsGameLevel::longestEventCallbackMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestEventCallbackMs
- PhotonMatchmaking::TrafficStatsGameLevel::longestEventCallbackCode was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestEventCallbackCode
- PhotonMatchmaking::TrafficStatsGameLevel::longestDeltaBetweenDispatchingMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestDeltaBetweenDispatchingMs
- PhotonMatchmaking::TrafficStatsGameLevel::longestDeltaBetweenSendingMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestDeltaBetweenSendingMs
- PhotonMatchmaking::TrafficStatsGameLevel::dispatchIncomingCommandsCalls was renamed to PhotonMatchmaking::TrafficStatsGameLevel::DispatchIncomingCommandsCalls
- PhotonMatchmaking::TrafficStatsGameLevel::sendOutgoingCommandsCalls was renamed to PhotonMatchmaking::TrafficStatsGameLevel::SendOutgoingCommandsCalls
- PhotonMatchmaking::TrafficStatsGameLevel::totalByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalMessageCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalMessageCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalIncomingByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalIncomingByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalIncomingMessageCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalIncomingMessageCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalOutgoingByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalOutgoingByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalOutgoingMessageCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalOutgoingMessageCount
- PhotonMatchmaking::WebFlags::httpForward was renamed to PhotonMatchmaking::WebFlags::HttpForward
- PhotonMatchmaking::WebFlags::sendAuthCookie was renamed to PhotonMatchmaking::WebFlags::SendAuthCookie
- PhotonMatchmaking::WebFlags::sendSync was renamed to PhotonMatchmaking::WebFlags::SendSync
- PhotonMatchmaking::WebFlags::sendState was renamed to PhotonMatchmaking::WebFlags::SendState
- PhotonMatchmaking::WebRpcResponse::resultCode was renamed to PhotonMatchmaking::WebRpcResponse::ResultCode
- PhotonMatchmaking::WebRpcResponse::errorString was renamed to PhotonMatchmaking::WebRpcResponse::ErrorString
- PhotonMatchmaking::WebRpcResponse::uriPath was renamed to PhotonMatchmaking::WebRpcResponse::UriPath
- PhotonMatchmaking::WebRpcResponse::returnData was renamed to PhotonMatchmaking::WebRpcResponse::ReturnData
- Misc.h CRC64() was renamed to Crc64, detail::pow10 was renamed to Detail::Pow10, detail::pow10table was renamed to Detail::POW_10_TABLE
- Methods in StringHeap.h and public members were renamed to PascalCase
- PhotonCommon::to_string_type was renamed to PhotonCommon::ToStringType
Build 2363 (Jun 10, 2026)
Breaking Changes
- The OnForceDisconnect callback now returns a PhotonCommon::StringType instead of a std::string and also returns a reason enum
Build 1969 (May 07, 2026)
Breaking Changes
- OnOwnershipRequest signature: bool(ObjectRoot*, PlayerId) -> void(ObjectRoot*, PlayerId). No longer a vote; owner replies asynchronously via Client::RespondToOwnershipRequest(obj, granted)
- C API: obj_give_away_owner → obj_respond_to_ownership_request(client, obj, granted). C#: Object.GiveAwayOwner -> Object.RespondToOwnershipRequest
- Removed Client::SetGiveAwayOwner and Client::RejectOwnershipRequest
- Removed OnObjectOwnerAssigned — use OnObjectOwnerChanged and compare against LocalPlayerId()
Bug Fixes
- Fixed: OnObjectOwnerChanged now also fires on first owner assignment during create
- Fixed: Request cooldown only bumps when the owner is reachable
- Fixed: Other consistency issues with ownership change behaviour
Build 1923 (May 05, 2026)
What's New
- The former
SharedClientSDK is renamed to Fusion Core. Almost every public surface changed: theSharedModenamespace becomesFusionCore, the singleFusionstatic library is split intoPhotonCommon→PhotonMatchmaking→FusionCore, and a new optionalFusionCAPIMODULE exposes a flat C ABI for engine bindings. The single-scene model is replaced by a multi-map session,PlayerPredictedownership andSimulationMode::Authorityenable server-authoritative prediction with input replay, andRealtimeClientgains a fullTask<Result<T>>async API. C++20 is now required
Changes
- Changed: namespace
SharedMode::*→FusionCore::*.SharedModeCompat.his included from every public header for partial source-compat - Changed: single
Fusionstatic library replaced byPhotonCommon→PhotonMatchmaking→FusionCorechain - Added: optional
FusionCAPIMODULE library exposing a flat C ABI — 235+ functions, opaque handles, polled event queue, blittableFusionEvent(28 B), unifiedFusionEventTypeenum (0–18 client / 100–116 realtime async / 200–220 realtime broadcasters), blittableFusionNetworkStats/FusionTrafficStats/FusionTrafficStatsGameLevel/FusionEMAReport. Header:FusionCore/libs/fusion_c_api/include/FusionCAPI.h - Added: cache flag
FUSION_BUILD_CAPI(ON for standalone, OFF for engine presets, always OFF on WASM, STATIC on iOS withFUSION_CAPI_STATICdefine) - Changed: library output filenames now embed the MSVC runtime suffix
_mt/_md(e.g.fusion_windows_x64_release_mt.lib) - Added: cache var
FUSION_MSVC_RUNTIME_LIBRARY(MultiThreaded/MultiThreadedDLL) drives the suffix and prebuilt PhotonRealtime variant filtering - Changed: CMake presets split across
CommonConfigurePresets.json,CommonBuildPresets.json,PlatformPresets.json,StandalonePresets.json,UnrealPresets.json,GodotPresets.json,TestPresets.json. Configure presets named<platform>-<arch>-<engine>[-<runtime>], build presets<platform>-<engine>[-<runtime>]-{debug,release} - Changed: C++ standard bumped to C++20 (required for
Task<T>coroutines) - Changed: CMake minimum bumped to 3.31
- Changed:
Version.his generated fromVersion.h.inat configure time usingversion.txt - Removed:
Client::ChangeScene(index, sequence, data)(single-scene model) - Added:
Client::MapChange(data)returningMap, plusMapAdd(data),MapRemove(map),MapIsValid(map)andGetMaps()for additive multi-map sessions - Changed:
Client::CreateSceneObjectrenamed toClient::CreateMapObject. TakesMapinstead ofuint32_t sceneanduint32_t engineFlagsinstead ofObjectSpecialFlags - Changed:
DestroyModes::SceneChangerenamed toDestroyModes::MapChange - Changed:
RPC_InternalSceneChangerenamed toRPC_InternalMapChange - Added:
RPC_InternalMapAdd,RPC_InternalMapRemove,RPC_InternalOwnershipRequest,RPC_InternalRejectSubObject,RPC_InternalDestroyedMapActors,RPC_InternalForceDestroyObject,RPC_InternalForceAliveObject,RPC_InternalInput,RPC_InternalPlayerInterest,RPC_InternalOwnershipResponse(12 reserved IDs total in 1..1023) - Removed:
OnSceneChange(index, sequence, Data&)broadcaster - Added:
OnMapChange(unordered_map<Map, Data>&, bool initial)broadcaster - Changed: room property
fusion_scene_datarenamed tofusion_map_data(now base64-encodedFusionMapStateBuilderpayload) - Removed: public
ObjectRoot::Scenefield. UseObjectRoot::GetMap()returningId.Map - Changed:
PlayerIdnarrowed fromuint32_ttouint16_t. Sentinels:MasterClientPlayerId = 0xFFFF,PluginPlayerId = 0xFFFE,ObjectOwnerPlayerId = 0xFFFD - Added:
Maptypedef (uint16_t) - Changed:
ObjectIdis now{Origin, Map, Counter}(still 8 bytes —Origin@016-bit,Map@216-bit,Counter@432-bit) - Changed:
ObjectId(packed)decoding is nowOrigin = packed & UINT16_MAX; Map = (packed >> 16) & UINT16_MAX; Counter = packed >> 32 - Changed:
Client::GetNewObjectId()is nowClient::GetNewObjectId(Map map) - Changed:
ObjectTailgrew from 24 bytes to 72 bytes. AddedReserved[8],PredictingPlayer,RejectedSequence,InputSequence,InputTime. RenamedSendRate→RoomSendRate - Changed:
Object::ExtraTailWordsis now 18 (was 6) - Added:
ObjectOwnerModes::PlayerPredicted = 5 - Added:
enum class SimulationMode { Shared = 0, Authority = 1 } - Changed:
RpcFlagsreworked from a struct (uint32_t _value) into anenum classwith bitwise operators and aHasFlag(flags, flag)helper - Added:
RpcFlags::IncorrectTargetForward,DontReplyWithResult,MapIncorrect,MaxDeliveryAttemptsReached, plusErrorFlagsaggregate - Removed:
Rpc::TargetComponent(uint16_t) field - Removed:
Rpc::DescriptorTypeHash(uint64_t) field. Routing now uses(Id, EventHash)only - Added:
Rpc::Sequence(uint64_t) andRpc::DeliveryAttempts(uint32_t) - Removed:
DescriptorTypeHashparameter fromClient::CreateUserRpc. New signature:(id, targetPlayer, targetObject, EventHash, data, dataLength) - Changed:
Client::SendUserRpcnow takesRpc&(non-const) — the SDK assignsSequencein place - Changed:
Client::SetSendRate(obj, rate)renamed toSetRoomSendRate(obj, rate).ResetSendRate(obj)renamed toResetRoomSendRate(obj) - Added:
Client::ResetLocalSendRate(obj)(counterpart to existingSetLocalSendRate) - Removed:
Client::ClearAllKeys,ClearAreaKeys,ClearUserKeys,SetAreaKeys,AddUserKey,RemoveUserKey,GetAllAreaKeys,GetAllUserKeys,GetInterestKeys. Replaced byInterestKeySet - Added:
Client::GetLocalInterestKeys()/GetPlayerInterestKeys(player)returningInterestKeySet&(withSet,Remove,Clear,ClearAreaKeys,ClearUserKeys,SetAreaKeys,AddUserKey,RemoveUserKey,GetAllAreaKeys,GetAllUserKeys,IsDirty,ClearDirtyand area/user encoding in the low bit) - Changed:
Client::Start()now returnsbool(wasvoid) — validatesfusion_configandfusion_map_dataroom properties and returnsfalseon precondition failure - Added:
Client::RefreshRoomCache() - Added:
Client::SetDynamicOwnerCooldown(seconds)/GetDynamicOwnerCooldown()(default1.0/3seconds, configurable at runtime) - Removed:
Object::DynamicOwnerCooldownTimestatic constant - Added:
Client::SetAuthoritySendRate(rate)/GetAuthoritySendRate()(default 30 Hz) - Added: prediction APIs
Client::GetSimulationMode(),GetPredictingPlayer(obj),SetPredictingPlayer(obj, player),IsPredictingPlayer(obj),HasInputAuthority(obj),GetInputSequence(obj),SetInputSequence(obj, seq),NextInputSequence() - Added:
ObjectRoot::QueueInput(dt, payload),ExecuteInputs(dt),GetInputQueueCount(),GetInputQueueDeltaTime(),GetInputTime() - Added:
Client::SetGiveAwayOwner(obj, player)to initiate explicit ownership transfers - Added:
Client::RejectOwnershipRequest(obj)to deny inboundOnOwnershipRequestrequests - Changed:
OnOwnerWasGivenrenamed toOnObjectOwnerAssigned - Changed:
OnObjectPredictionOverriderenamed toOnPredictionOverride - Added: broadcasters
OnRpcError,OnObjectForceAlive,OnSubObjectForceAlive,OnInput,OnPredictionReset,OnOwnershipRequest(returnsbool, aggregate any-truegrants),OnOwnershipResponse - Changed:
OnDestroyedMapActor(uint32_t, ObjectId)simplified toOnDestroyedMapActor(ObjectId)(first parameter dropped) - Removed: public
Object::Headerfield - Added:
Object::EngineBlob(Data),Object::EngineHash(uint64_t),Object::EngineFlags(uint32_t) replacingHeader - Removed:
enum class ObjectSpecialFlags.engineFlags(uint32_t) is supplied toCreate*calls and stored on the base class - Removed:
Object::Statusfield andOBJECT_STATUS_NEW/OBJECT_STATUS_PENDING/OBJECT_STATUS_CREATEDconstants - Added:
ObjectRoot::IsReady()andGetHasReceivedState()lifecycle queries - Removed:
Object::GetBytesSendLastTick,GetBytesReceivedLastTick,ConsumeBytesSendLastTick,ConsumeBytesReceivedLastTick,ResetReceivedBytes - Added: EMA-based stats
Object::GetSendReport()/GetRecvReport(),ObjectRoot::GetCombinedSendReport()/GetCombinedRecvReport(),Client::GetSendReport / GetRecvReport / GetSendStateReport / GetRecvStateReport / GetSendRpcReport / GetRecvRpcReport. ReturnsEMAReport { TotalAvg, TotalAvgPerSecond, CurrentAvgPerSecond, Min, Max }. New header:EMA.h - Removed: public
ObjectChild::TargetObjectHash(uint32_t) field - Changed:
Client::CreateSubObjectparametertargetObjectHash(uint32_t) renamed toengineHash(uint64_t, widened);ObjectSpecialFlagsparameter replaced byuint32_t engineFlags - Changed:
ObjectChild::Parentis now private. Access via staticObjectChild::GetParent(obj) - Changed: most
ObjectRootstate is private with getters (GetMap,GetOwner,GetOwnerMode,GetTime,IsReady,GetHasReceivedState,GetPluginVersion,GetClientVersion,GetSubObjects) - Changed:
ObjectRoot::RequiredObjects()returnsstd::span<ObjectId>(wasObjectId*) - Changed:
Object::StringHeapis lazy-allocated ({0}); was pre-allocated to 1024 bytes - Changed:
Object::SetHasValidData()no longer takes aboolargument (always sets the flag) - Changed:
LogLevelenum is now a bitmask (Trace = 1 << 0...Error = 1 << 4) - Added:
WriteBuffer::WriteMap(Map)/ReadBuffer::ReadMap()wire codec for the newMaptypedef - Added: public
PhotonCommontypes:Broadcaster<Sig>,Subscription,ScopedSubscription,SubscriptionBag,Result<T, CodeT>,Task<T>(C++20 coroutine),Error<CodeT>,LogOutput,LogUtils,SpanCompat,StringType,StringViewType,CoroutineCompat,PhotonAssert - Changed: every long-running
RealtimeClientoperation now returnsTask<Result<T>>(Connect / Reconnect / Disconnect / CreateRoom / JoinRoom / JoinOrCreateRoom / JoinRandomRoom / JoinRandomOrCreateRoom / LeaveRoom / JoinLobby / LeaveLobby / GetLobbyStats / FindFriends / WebRpc / AvailableRegions / SelectRegion) - Added:
RealtimeClientbroadcastersOnRoomJoined,OnRoomLeft,OnDirectConnectionEstablished,OnDirectConnectionFailed,OnCustomOperationResponse,OnCacheSliceChanged,OnPropertiesChangeFailed,OnAppStatsUpdated,OnWarning - Added:
RealtimeClient::SendCustomOperation,SendCustomAuthData,SetAutoJoinLobby,GetCountPlayersIngame,GetCountGamesRunning,GetCountPlayersOnline - Added: public
PhotonMatchmakingoption/value typesClientConstructOptions,ConnectOptions,CreateRoomOptions,JoinRoomOptions,MatchmakingOptions,EventOptions,DirectMessageOptions,MutableRoomView,PlayerView,RoomListing,LobbyStats,FriendInfo,NetworkStats,TrafficStats,TrafficStatsGameLevel,WebFlags,WebRpcResponse,PropertyValue,AuthenticationValues,RegionInfo,ConnectionState,DisconnectCause,LobbyType,MatchmakingMode,RegionSelectionMode,ServerType,DirectMode,ReceiverGroup,CustomAuthenticationType,EventCache,EventCallback,ConnectionProtocol,SerializationProtocol,ErrorCode - Added:
FusionRoomProperties.hexposing canonical room property keys (Config/MapData/SdkVersion),FusionConfigDefaults::Json,FusionMapStateBuilder::Build/Empty/BuildBase64/EmptyBase64,FusionSdkVersionBuilder::ToBytes/ToBase64,Base64::Encode/Decode - Added: CAPI helpers
fusion_room_property_key_config / _map_data / _sdk_version,fusion_config_defaults_json,fusion_map_state_empty_base64,fusion_sdk_version_current_base64,fusion_base64_encode / _decode - Added: CAPI web-flag bitmask
FUSION_WEB_FLAG_HTTP_FORWARD,FUSION_WEB_FLAG_SEND_AUTH_COOKIE,FUSION_WEB_FLAG_SEND_SYNC,FUSION_WEB_FLAG_SEND_STATE - Added:
Tools/FusionCore/Fusion{Config,Build,Install,ConfigBuildInstallAll,PackagePlugin}.ps1PowerShell wrappers around the preset matrix - Added:
Tools/Common/{Logging,TeamCity}/*.psm1shared PowerShell modules - Added:
Tools/Changelog/generate_changelog.pyPython changelog generator (withmapping.jsoncategorization) - Changed: GoogleTest 1.17.0 fetched via
FetchContentwhenPHOTON_BUILD_TESTS=ON.gtest_force_shared_crtis matched toFUSION_MSVC_RUNTIME_LIBRARY - Migration Notes
-
- Global rename
SharedMode::→FusionCore::(the includedSharedModeCompat.hcovers some callers; plan for a real rename)
- Global rename
-
PlayerIdisuint16_tandObjectId's middle 16 bits are nowMap— re-derive any custom packing or wire serialization. Sentinels moved from the0xFFFFFFFFfamily to the0xFFFFfamily
-
ObjectTailis 72 bytes (ExtraTailWords = 18); recompute any direct word offsets and renameSendRate→RoomSendRate
-
- Replace
ChangeScene(idx, seq, data)withMapChange(data)(orMapAdd); subscribe toOnMapChange(maps, initial)and diff the table; swapDestroyModes::SceneChange→MapChange
- Replace
-
- Replace
CreateSceneObjectwithCreateMapObject. PassMapinstead ofuint32_t sceneanduint32_t engineFlagsinstead ofObjectSpecialFlags. For sub-objects,targetObjectHashbecomesengineHash(uint64_t)
- Replace
-
- Drop
DescriptorTypeHashfromCreateUserRpc;SendUserRpctakesRpc&(non-const). ReplaceRpcFlags{._value=...}with the strong enum andHasFlag()
- Drop
-
- Rename
SetSendRate→SetRoomSendRateandResetSendRate→ResetRoomSendRate. PairSetLocalSendRatewith the newResetLocalSendRate
- Rename
-
- Client-level interest-key methods are gone; use
Client::GetLocalInterestKeys()/GetPlayerInterestKeys(player)and call methods on the returnedInterestKeySet
- Client-level interest-key methods are gone; use
-
- Drop reads of
Object::Status/SpecialFlags/Headerand the per-frame byte counters. UseObjectRoot::IsReady()/GetHasReceivedState(),EngineBlob/EngineFlags/EngineHash, and the EMA reports
- Drop reads of
-
- Subscribe to
OnObjectOwnerAssigned(replacesOnOwnerWasGiven) andOnPredictionOverride(replacesOnObjectPredictionOverride); addOnPredictionResetif you usePlayerPredicted
- Subscribe to
-
- Initiate ownership transfers via
Client::SetGiveAwayOwner(obj, player); grant inbound requests by returningtruefromOnOwnershipRequest; deny viaClient::RejectOwnershipRequest(obj)
- Initiate ownership transfers via
-
- For C ABI integrations, switch to
FusionCAPI.h(the old SDK had no C ABI). For CMake on MSVC, setFUSION_MSVC_RUNTIME_LIBRARYtoMultiThreadedorMultiThreadedDLLand pick the matching preset
- For C ABI integrations, switch to