t1k:unity:rendering:feel-juice
| Field | Value |
|---|---|
| Module | rendering |
| Version | 3.1.7 |
| Effort | medium |
| Tools | — |
How to invoke
Section titled “How to invoke”/t1k:unity:rendering:feel-juice[feature-name | chaosforge | screen-shake | haptics | loot-toast]t1k:unity:rendering:feel-juice
Section titled “t1k:unity:rendering:feel-juice”MoreMountains Feel v5.9.1 integration guide for Unity 6 + DOTS-AI. Feel is Mono-only — never call from Burst/ISystem. Use the bridge pattern.
Decision Tree
Section titled “Decision Tree”| You want to… | Action |
|---|---|
| Decide if Feel is right for this feature | Decision Matrix |
| Wire Feel to DOTS events | Bridge Pattern |
| Configure an MMF_Player | MMF_Player Anatomy |
| Add haptics on iOS/Android | NiceVibrations Guide |
| Debug a Feel integration | Gotchas |
| See ChaosForge example | ChaosForge Integration |
Identity
Section titled “Identity”Package: Assets/Feel/ — MMFeedbacks + MMTools + NiceVibrations 4.1.2
Version: v5.9.1 | Engine: Unity 6000.3.9f1 | Pipeline: URP only
When to Use Feel vs DOTS Lib
Section titled “When to Use Feel vs DOTS Lib”Use Feel only for presentation-layer polish — sounds, haptics, screen shake, UI toasts, particles. Never for gameplay logic.
Quick rule
Section titled “Quick rule”| Signal type | Owner |
|---|---|
| Floating damage numbers | DamageNumberSystem (DOTS lib) — NOT Feel |
| Hit flash | HitFlashTriggerSystem + HitFlashAnimateSystem — NOT Feel |
| Hit stop (slow-mo frame) | HitStopSystem + HitStopEvent — NOT Feel (TimeScale conflict) |
| Crit damage variant | DamageNumberStyleSO.crit branch — NOT Feel |
| Screen shake (trigger) | CameraTraumaAuthoring + TraumaShakeSystem — keep producer |
| Screen shake (consumer) | Feel MMF_CinemachineImpulse — replace CinemachineCameraBridge |
| Death dissolve VFX | Hybrid: DOTS triggers dissolve animation; Feel adds debris/audio/haptics |
| Loot drop toast | Feel wins: MMF_Position + MMF_CanvasGroup + MMF_Sound + MMF_NiceVibrations |
| Boss phase shake | Feel MMF_Player variant — replace BossPhaseShakeSystem consumer |
Full 9-item ChaosForge checklist: Decision Matrix
Bridge Pattern Overview
Section titled “Bridge Pattern Overview”Feel is Mono-only (main-thread, managed heap). The canonical bridge:
- DOTS
ISystem(Burst) writesDynamicBuffer<FeelEvent>on an ECS singleton entity FeelCombatBridgeMonoBehaviour polls the buffer inLateUpdate()- Bridge calls
mmf_player.PlayFeedbacks(position, intensity) - Bridge clears the buffer
NEVER call Feel from inside ISystem.OnUpdate, a Job struct, or any [BurstCompile] context. Results in UnityException: main thread only.
Full implementation: DOTS Bridge Pattern
MMF_Player Anatomy
Section titled “MMF_Player Anatomy”MMF_Player (formerly MMFeedbacks) is the runtime container. Key fields:
- Feedbacks list — ordered; each entry has
Delay,Timing,Label - Initialization Mode —
Start(default),Awake, orScript(callInitialization()manually) - Can Play While Already Playing — set per feedback; pool exhaustion risk if unchecked
- Cooldown — global re-trigger guard (seconds)
- MMChannelData — cross-component routing by channel ID
API: PlayFeedbacks(), PlayFeedbacks(Vector3 position, float intensity), StopFeedbacks(), PauseFeedbacks(), PlayFeedbacksInReverse()
Full field reference: MMF_Player Anatomy
Performance Budget (Mobile — Snapdragon 665+)
Section titled “Performance Budget (Mobile — Snapdragon 665+)”- Total Feel budget: 5–10ms/frame at 60 FPS (portrait 2160×1080)
- Concurrent event ceiling: ~50 events/frame
- NiceVibrations: 0.1ms overhead; Android vibrator is async (fire-and-forget)
- Screen shake: Cinemachine Impulse < 0.5ms; MMF_CameraShake < 0.3ms
- Particle bursts: cap at 200 particles/burst for mobile; use
ParticleSystem.Emit(n)not Play
Mobile / Platform Quirks
Section titled “Mobile / Platform Quirks”- NiceVibrations requires
Assets/Feel/NiceVibrations/Scripts/...in any assembly that calls it. iOS 6s+ and Android API 26+ only. Desktop = no-op (safe). - URP post-processing feedbacks (bloom, vignette) need
Universal RPpackage ANDPost Process LayerNOT enabled via HDRP path. See Gotchas #7. - Coroutine-based feedbacks (
MMF_WaitForSeconds,MMF_Hold) ignoreTime.timeScale. UseTimescaleModes.Unscaledfor slow-mo compatibility. See Gotchas #5.
Gotchas (Summary)
Section titled “Gotchas (Summary)”- Triggering Feel inside entity iteration → frame hitch
- Cross-thread invocation →
UnityException: main thread only - Feel refs in SubScene → broken after bake — keep in main scene
- NiceVibrations time skew — call same frame as visual
- Coroutines ignore
timeScale— useUnscaledmode in slow-mo - Pool exhaustion under high event rate — check
IsPlayingbefore re-trigger - URP/HDRP post-process parity gaps
- Prefab variant corruption after MMF_Player edit
All expanded with symptom / cause / fix: Gotchas