Feedback Manager
Updated: Oct 30, 2025
Feedback Manager is a centralized, rule-based system that maps interaction events to feedback actions such as haptics, audio, VFX, so you don’t need to include feedback logic across each Interactable object. It consumes Interaction SDK’s unified Pointer Events flow and plays feedback consistently across interactor types.
Interaction SDK surfaces all core interactions (Hover, Select, and so on) through a unified Pointer Lifecycle and Pointer Events contract. Feedback Manager subscribes to those events (via the Interaction Broadcaster or a provided InteractionEventChannel) and executes reusable FeedbackAction assets. This keeps feedback decoupled from interactables and consistent across hands/controllers and UI.
The Feedback Manager uses an event-driven architecture that processes interaction events and executes feedback based on matching rules:
- Event-driven: Listens for interaction events (Hover/Unhover/Select/Unselect/Move/Cancel; also UIHover/UISelect) emitted by interactable objects and UI pointers.
- Rule-based: A FeedbackConfig asset holds an ordered list of rules (first-match wins). Rules can filter by interaction type, Unity Tag, and InteractorKind (Poke, Ray, Grab, HandGrab, and so on).
- Hierarchical overrides: A per-object FeedbackSettings component can suppress feedback or override global rules.
- Modular actions: Each rule runs one or more FeedbackAction ScriptableObjects (for example, haptic clip, sound, VFX).
- Haptics integration: Works with the Haptics SDK for Unity if you want authored clips or controller impulses.
Before proceeding with this tutorial, complete the setup steps outlined in the following sections:
- In the Project panel, navigate to Packages > Meta XR Interaction SDK > Runtime > Prefabs > Feedback.
- Drag
FeedbackManager.prefab into the root of your scene Hierarchy.
The prefab includes both the FeedbackManager component and the InteractionBroadcaster component. It also references a default FeedbackConfig asset and InteractionEventChannel.
Step 2: Verify interactor decorators
Interaction SDK’s interactor prefabs (Poke, Ray, Grab, HandGrab, DistanceHandGrab, HandGrabUse) include an InteractorControllerDecorator component that routes haptic feedback to the correct controller or hand.
- In the Hierarchy panel, expand your interaction rig and select an interactor.
- In the Inspector, verify that the InteractorControllerDecorator component is present. If the component is missing, add it by selecting Add Component > InteractorControllerDecorator.
Step 3: Test in Play mode
Press Play in the Unity Editor to test the default feedback configuration. The default rules provide light haptic feedback on hover and stronger haptic pulses on select for both 3D objects and UI interactions.
You can configure global rules or per-object overrides to define how the FeedbackManager behaves.
Define global rules in FeedbackConfig
Use a FeedbackConfig asset to define feedback rules that apply across your entire scene. Rules are evaluated in order from top to bottom, and the first matching rule determines which feedback actions execute.
- In the Project panel, right-click in your Assets folder and select Create > Interaction SDK > Feedback Config.
- Name your asset (for example, “MyFeedbackConfig”).
- Select the asset in the Project panel to view it in the Inspector.
- In the Rules list, click the + button to add a new rule.
- Configure each rule with the following properties:
- Interaction Type: Event type that triggers this rule (for example, HoverStart, SelectEnd, UISelectStart)
- Tag (optional): Tag name that matches all GameObjects that contain that name
- Interactor Kind: Interaction type that matches all interaction methods of the same type such as Any, Poke, Ray, Grab, and HandGrab
- Actions: List of FeedbackAction assets to execute when this rule matches
- Arrange rules from most specific (tagged, specific interactor kinds) to most general (any tag, any interactor kind). For guidance on rule ordering, see the Best practices section.
- In the Hierarchy, select the FeedbackManager GameObject.
- In the Inspector, assign your new FeedbackConfig asset to the Config field.
Per-object overrides (FeedbackSettings)
Use the FeedbackSettings component to customize feedback for individual interactable objects, overriding the global rules.
- In the Hierarchy, select an interactable GameObject such as a button or grabbable object.
- In the Inspector, click Add Component and search for FeedbackSettings.
- Select a Mode:
- Default: Uses the global rules from the FeedbackConfig
- Suppress: Blocks all feedback for this object
- Override: Uses custom feedback actions per interaction type and blocks any global rules for that object.
- If you selected Override, expand the Overrides section and configure feedback actions for specific interaction types.
Actions are ScriptableObjects derived from FeedbackActionSO with a single entry point:
public override void Execute(int identifier, GameObject source, FeedbackManager manager) { ... }
Example: Custom audio feedback action
This example shows how to create a custom feedback action that plays an audio clip when an interaction occurs:
using Oculus.Interaction.Feedback;
using UnityEngine;
namespace YourNamespace
{
[CreateAssetMenu(menuName = "Your Project/Feedback/Audio Feedback")]
public class AudioFeedbackAction : FeedbackActionSO
{
[SerializeField]
private AudioClip _audioClip;
[SerializeField, Range(0f, 1f)]
private float _volume = 0.8f;
public override void Execute(int identifier, GameObject source, FeedbackManager manager)
{
if (_audioClip != null && source != null)
{
AudioSource.PlayClipAtPoint(_audioClip, source.transform.position, _volume);
}
}
}
}
After creating this script:
- Right-click in the Project panel and select Create > Your Project > Feedback > Audio Feedback.
- Assign an AudioClip and adjust the volume.
- Add the created asset to a rule’s Actions list in your FeedbackConfig.
</oc-devui-note>
The Feedback Manager exposes the following API:
static FeedbackManager Instance – Singleton instance of the FeedbackManagerstatic bool Exists – Returns true if a FeedbackManager instance exists in the sceneFeedbackConfig Config – The currently active FeedbackConfig assetvoid PlayHaptics(int sourceId, in HapticPattern pattern) – Plays a haptic pattern on the controller associated with the source IDvoid StopHaptics(int sourceId) – Stops haptic playback on the controller associated with the source ID
Rule FindRule(InteractionType type, GameObject src, IInteractorView view, int pointerId) – Finds the first matching rule for the given parametersstatic InteractorKind KindOf(IInteractorView view, int pointerId) – Determines the InteractorKind from an interactor view
FeedbackMode Mode – The feedback mode (Default, Suppress, or Override)bool TryGetOverrideActions(InteractionType type, out IReadOnlyList<FeedbackActionSO> actions) – Gets the override actions for a specific interaction type
Follow these recommendations when configuring the Feedback Manager:
- Order rules from specific to general. Place rules with specific tags and interactor kinds first, then add broader fallback rules. This ensures precise matching for special cases while providing default behavior for everything else. For example:
- Rule 1: Tag=”Button”, InteractorKind=Poke, SelectStart → Strong haptic pulse
- Rule 2: Tag=”Button”, InteractorKind=Any, SelectStart → Medium haptic pulse
- Rule 3: Tag=Any, InteractorKind=Any, SelectStart → Light haptic pulse
- Reuse FeedbackAction assets across multiple rules. Instead of creating duplicate assets, reference the same FeedbackAction from multiple rules to maintain consistency and reduce asset management overhead.
- Use Unity Tags to categorize interactables. Assign tags like “Button”, “Lever”, or “Door” to express semantic categories, then write rules that target those tags. This makes it easy to apply consistent feedback to entire classes of objects.
- Minimize allocations in Execute() methods. Keep your custom FeedbackAction implementations efficient by avoiding frequent allocations. Consider using object pooling for VFX and audio sources.
- Combine with Event Wrappers for flexibility. If designers prefer inspector-based wiring for specific objects, use the Event Wrapper pattern on individual interactables while maintaining the Feedback Manager for global consistency.
Problem: Interactor doesn’t trigger a haptic response
Solution: Verify the following:
- Ensure the FeedbackManager GameObject is active in your scene.
- Check that your FeedbackConfig has a rule matching the interaction type, interactor kind, and object tag.
- Select the interactor in the Hierarchy and verify that an InteractorControllerDecorator component is attached.
- If using a custom FeedbackAction, add debug logging to the
Execute() method to confirm it’s being called.
Problem: Wrong feedback plays for an interaction
Solution: Check your rule order and object tags:
- Review the rule order in your FeedbackConfig. Remember that the first matching rule executes.
- Select the interactable object in the Hierarchy and verify it contains a matching Unity tag in the Inspector.
- Temporarily add a DebugLogAction to your rules to see which rule is matching.
Solution: Optimize your feedback actions:
- Use object pooling for particle effects and audio sources to avoid instantiation overhead.
- Limit the number of simultaneous audio sources playing.
- Profile your custom
Execute() methods using Unity’s Profiler to identify performance bottlenecks.