<!--
{
  "availability" : [
    "iOS: 18.0.0 -",
    "iPadOS: 18.0.0 -",
    "macCatalyst: 18.0.0 -",
    "macOS: 15.0.0 -",
    "tvOS: 26.0.0 -",
    "visionOS: 2.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "RealityKit",
  "identifier" : "/documentation/RealityKit/ForceEffectProtocol",
  "metadataVersion" : "0.1.0",
  "role" : "Protocol",
  "symbol" : {
    "kind" : "Protocol",
    "modules" : [
      "RealityKit"
    ],
    "preciseIdentifier" : "s:17RealityFoundation19ForceEffectProtocolP"
  },
  "title" : "ForceEffectProtocol"
}
-->

# ForceEffectProtocol

A protocol that defines a custom force effect.

```
protocol ForceEffectProtocol
```

## Overview

A custom force effect is a function of a set of input rigid body attributes and returns force-like vector quantities.
You can declare this custom force effect’s input types ([`parameterTypes`](/documentation/RealityKit/ForceEffectProtocol/parameterTypes)) and
output types ([`forceMode`](/documentation/RealityKit/ForceEffectProtocol/forceMode)) by conforming to `ForceEffectProtocol`.

For example, you can declare a custom force effect that depends on rigid bodies’ position and mass,
and computes acceleration for each rigid body.

```swift
struct MyCustomForce : ForceEffectProtocol {
    var parameterTypes: PhysicsBodyParameterTypes { [.position, .mass] }
    var forceMode: ForceMode = .acceleration
    func update(parameters: inout ForceEffectParameters) {
    }
}
```

Register your custom force effect to enable the physics system to compute forces affected by rigid bodies.

```swift
MyCustomForce.register()
```

At each physics update, the [`update(parameters:)`](/documentation/RealityKit/ForceEffectProtocol/update(parameters:)) method
receives the declared inputs from [`ForceEffectParameters`](/documentation/RealityKit/ForceEffectParameters).
You can set the output forces for each rigid body with [`setForce(_:index:)`](/documentation/RealityKit/ForceEffectParameters/setForce(_:index:)).

Sometimes, you may need to access properties from both your custom force effect
and the current context while computing forces in the update function.
The [`register(_:)`](/documentation/RealityKit/ForceEffectProtocol/register(_:)-1zt9t) method accepts an optional closure that
allows you to capture the necessary properties.
If you provide this closure to the register method, the update method is not required.

```swift
struct MyCustomForceClosure: ForceEffectProtocol {
    var forceMode: RealityFoundation.ForceMode = .force
    var parameterTypes: PhysicsBodyParameterTypes { [.position, .mass] }
    let customProperty: Double = 1
}

let contextualProperty: Double = 1

MyCustomForceClosure.register { event in
    // Access the effect property via `event.effect.customProperty`.
    // Access the input rigid body attributes via `event.parameters`.
    // Access the contextual property directly by `contextualProperty`.
}
```

## Topics

### Updating effects

[`func update(parameters: inout ForceEffectParameters)`](/documentation/RealityKit/ForceEffectProtocol/update(parameters:))

Defines how the custom force effect computes forces at each physics simulation step.

[`static func register(((inout ForceEffectEvent<Self>) -> Void)?)`](/documentation/RealityKit/ForceEffectProtocol/register(_:)-1zt9t)

Registers the custom effect.

[`struct PhysicsBodyParameterTypes`](/documentation/RealityKit/PhysicsBodyParameterTypes)

Defines which rigid body inputs are required by a force effect’s update handler.

[`struct ForceEffectParameters`](/documentation/RealityKit/ForceEffectParameters)

The force effect input data to the effect’s update handler or closure.

[`struct ForceEffectEvent`](/documentation/RealityKit/ForceEffectEvent)

A struct that defines the arguments to the custom force effect update closure.

[`struct UnsafeForceEffectBuffer`](/documentation/RealityKit/UnsafeForceEffectBuffer)

Provides access to physics body parameters from the effect’s update function or event handler.

### Instance Properties

[`var forceMode: ForceMode`](/documentation/RealityKit/ForceEffectProtocol/forceMode)

The mode that controls how the physics system interprets the outputs from a user’s custom force computation.

[`var parameterTypes: PhysicsBodyParameterTypes`](/documentation/RealityKit/ForceEffectProtocol/parameterTypes)

The input types to user’s custom force computation.

### Type Methods

[`static register(_:)`](/documentation/RealityKit/ForceEffectProtocol/register(_:))

Registers the custom effect.

## Relationships

### Conforming Types

[`VortexForceEffect`](/documentation/RealityKit/VortexForceEffect)

[`RadialForceEffect`](/documentation/RealityKit/RadialForceEffect)

[`TurbulenceForceEffect`](/documentation/RealityKit/TurbulenceForceEffect)

[`ConstantRadialForceEffect`](/documentation/RealityKit/ConstantRadialForceEffect)

[`ConstantForceEffect`](/documentation/RealityKit/ConstantForceEffect)

[`DragForceEffect`](/documentation/RealityKit/DragForceEffect)

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)