{"record":{"id":"4589061d2372366f","repo":"stride3d/stride","slug":"unable-to-reach-the-game-side-instance","errorCode":null,"errorMessage":"Unable to reach the game-side instance","messagePattern":"Unable to reach the game-side instance","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/editor/Stride.Assets.Presentation/AssetEditors/GameEditor/ViewModels/GameEditorChangePropagator.cs","lineNumber":77,"sourceCode":"            listener.ValueChanged -= AssetSideNodeChanged;\n            listener.ItemChanged -= AssetSideNodeChanged;\n\n            running = false;\n            // This will resume the propagator task if it's awaiting, and allow it to complete.\n            propagatorQueue.Post(null);\n        }\n\n        public void NotifyGameSidePartAdded()\n        {\n            gameSideReady.SetResult(0);\n        }\n\n        private async Task Initialize([NotNull] TAssetPart assetSideInstance)\n        {\n            var partId = new AbsoluteId(Owner.Id.AssetId, assetSideInstance.Id);\n            var gameSideInstance = await Editor.Controller.InvokeAsync(() => Editor.Controller.FindGameSidePart(partId));\n            if (gameSideInstance == null)\n                throw new InvalidOperationException(\"Unable to reach the game-side instance\");\n\n            using (await DispatcherLock.Lock(true, Editor.Controller, Editor.Dispatcher))\n            {\n                Editor.Controller.Logger.Debug($\"Initial linking for part {assetSideInstance.Id}\");\n                var assetNode = (IAssetNode)Editor.NodeContainer.GetNode(assetSideInstance);\n                var gameNode = Editor.Controller.GameSideNodeContainer.GetOrCreateNode(gameSideInstance);\n                gameObjectLinker.LinkGraph(assetNode, gameNode);\n            }\n        }\n\n        private static void LinkNode(IGraphNode assetNode, IGraphNode gameNode)\n        {\n            var node = (IAssetNode)assetNode;\n            node.SetContent(GameSideContentKey, gameNode);\n        }\n\n        private void AssetSideNodeChanged(object sender, INodeChangeEventArgs e)\n        {","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/editor/Stride.Assets.Presentation/AssetEditors/GameEditor/ViewModels/GameEditorChangePropagator.cs#L59-L95","documentation":"GameEditorChangePropagator.Initialize resolves the game-side counterpart of an asset part by asking the controller (on the game thread) to FindGameSidePart for the part's AbsoluteId. If the lookup returns null — the game-side entity/object does not exist — the propagator cannot link asset and game nodes and throws InvalidOperationException.","triggerScenarios":"The asset-side instance (e.g. an entity inside a prefab/composable scene) has no corresponding game-side instance at propagation start: the part was added or renamed between the game start snapshot and propagator initialization, or the part id does not exist in the running scene.","commonSituations":"Editing a prefab while its instance is live in the game preview; parts created programmatically without being instantiated game-side; race where the game scene loaded a stale version of the scene.","solutions":["Ensure the asset is saved/instanced before starting the game preview so game-side parts exist for every asset part.","Wrap propagator creation in try/catch and re-create the propagator when the game scene reloads.","Verify the part's AbsoluteId (AssetId + part Id) matches an actual instance in the scene; fix custom tooling that fabricates ids."],"exampleFix":"// before\nvar gameSide = await controller.InvokeAsync(() => controller.FindGameSidePart(partId));\n// after\nvar gameSide = await controller.InvokeAsync(() => controller.FindGameSidePart(partId));\nif (gameSide == null)\n    logger.Warning($\"Part {partId} not instanced game-side; skipping propagation\");","handlingStrategy":"try-catch","validationCode":"var exists = await controller.InvokeAsync(() => controller.FindGameSidePart(partId) != null);\nif (!exists) return; // part not instanced game-side","typeGuard":null,"tryCatchPattern":"try { await propagator.Initialize(part); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"game-side instance\")) { logger.Warning($\"Skipping uninstanced part {partId}\"); }","preventionTips":["Start the game preview only from saved/instanced scenes","Re-create propagators when the game scene reloads","Avoid fabricating part ids in custom tooling"],"tags":["game-side","synchronization","prefab","propagation"],"backgroundTag":"resource-not-found","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}