{"record":{"id":"27373f91a0a7802c","repo":"stride3d/stride","slug":"cannot-perform-this-action-when-the-physics-engine-is-set-to","errorCode":null,"errorMessage":"Cannot perform this action when the physics engine is set to CollisionsOnly","messagePattern":"Cannot perform this action when the physics engine is set to CollisionsOnly","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Physics/Simulation.cs","lineNumber":576,"sourceCode":"                processor.RenderColliderShapes(value);\n            }\n        }\n\n        public RenderGroup ColliderShapesRenderGroup { get; set; } = RenderGroup.Group0;\n\n        internal void AddCollider(PhysicsComponent component, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask)\n        {\n            collisionWorld.AddCollisionObject(component.NativeCollisionObject, (BulletSharp.CollisionFilterGroups)group, (BulletSharp.CollisionFilterGroups)mask);\n        }\n\n        internal void RemoveCollider(PhysicsComponent component)\n        {\n            collisionWorld.RemoveCollisionObject(component.NativeCollisionObject);\n        }\n\n        internal void AddRigidBody(RigidbodyComponent rigidBody, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask)\n        {\n            if (discreteDynamicsWorld == null) throw new Exception(\"Cannot perform this action when the physics engine is set to CollisionsOnly\");\n\n            discreteDynamicsWorld.AddRigidBody(rigidBody.InternalRigidBody, (short)group, (short)mask);\n        }\n\n        internal void RemoveRigidBody(RigidbodyComponent rigidBody)\n        {\n            if (discreteDynamicsWorld == null) throw new Exception(\"Cannot perform this action when the physics engine is set to CollisionsOnly\");\n\n            discreteDynamicsWorld.RemoveRigidBody(rigidBody.InternalRigidBody);\n        }\n\n        internal void AddCharacter(CharacterComponent character, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask)\n        {\n            if (discreteDynamicsWorld == null) throw new Exception(\"Cannot perform this action when the physics engine is set to CollisionsOnly\");\n\n            var collider = character.NativeCollisionObject;\n            var action = character.KinematicCharacter;\n            discreteDynamicsWorld.AddCollisionObject(collider, (BulletSharp.CollisionFilterGroups)group, (BulletSharp.CollisionFilterGroups)mask);","sourceCodeStart":558,"sourceCodeEnd":594,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Physics/Simulation.cs#L558-L594","documentation":"AddRigidBody registers a rigid body with the discrete dynamics world, which only exists when the Simulation is created in full-simulation mode. When the physics engine is configured as CollisionsOnly, discreteDynamicsWorld is null because no dynamics simulation runs, so adding a rigid body is unsupported and throws.","triggerScenarios":"Calling simulation.AddRigidBody(rigidBody, group, mask) (directly or via adding a RigidbodyComponent to a scene) while the Simulation was created with CollisionsOnly flag.","commonSituations":"Project configured with physics CollisionsOnly for raycast/trigger-only gameplay, then a dynamic rigid body or character is added at runtime; copying physics setup code between projects with different simulation modes.","solutions":["Change the physics simulation mode away from CollisionsOnly (remove the CollisionsOnly flag in the physics settings / Simulation creation) so dynamic bodies are supported.","If CollisionsOnly is required, replace RigidbodyComponent usage with static colliders or trigger-only components.","Guard rigid-body registration code with a check that the simulation supports dynamics before calling AddRigidBody."],"exampleFix":"// before\nsimulation.AddRigidBody(rigidBody, CollisionFilterGroupFlags.DefaultFilter, CollisionFilterGroupFlags.DefaultFilter);\n// after\nif (simulation.DiscreteDynamicsWorld != null)\n    simulation.AddRigidBody(rigidBody, CollisionFilterGroupFlags.DefaultFilter, CollisionFilterGroupFlags.DefaultFilter);\nelse\n    throw new NotSupportedException(\"Dynamic bodies require a full physics simulation, not CollisionsOnly\");","handlingStrategy":"validation","validationCode":"bool supportsDynamics = simulation.DiscreteDynamicsWorld != null; // check before AddRigidBody","typeGuard":"bool IsFullSimulation(Simulation s) => s?.DiscreteDynamicsWorld != null;","tryCatchPattern":"try { simulation.AddRigidBody(rb, g, m); } catch (Exception ex) when (ex.Message.Contains(\"CollisionsOnly\")) { /* fall back to collider-only setup */ }","preventionTips":["Verify physics settings mode matches the components your scene uses.","Audit scenes for rigid bodies before enabling CollisionsOnly.","Centralize physics registration behind a helper that checks capability once."],"tags":["physics","stride","configuration","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}