Disparadors adaptatius DualSense

Defineix efectes de disparador adaptatiu DualSense com a dades en un ScriptableObject i reprodueix-los amb una sola crida al servei, sense codi HID ni cablejat per pad.

Per a què serveix aquest sistema

Els disparadors adaptatius del comandament DualSense són un dels canals de feedback més expressius disponibles per als desenvolupadors de Unity, i també un dels més tediosos d'implementar. Llegir la documentació del SDK de PS5, gestionar reports de sortida HID en format brut i fer seguiment de l'estat per dispositiu perquè les actualitzacions del disparador mai corrompuin la vibració — res d'això té cabuda al codi del joc.

El sistema Feedback de Serenity inclou un canal de disparador adaptatiu dedicat que gestiona la capa HID en escriptori i estructura el camí cap al SDK de PS5 en consola. L'efecte es defineix una sola vegada com a dada, es crida IFeedbackService.Play i el framework el lliura al pad correcte.

El problema a Unity

Els disparadors adaptatius DualSense requereixen escriure directament en el report de sortida HID USB del comandament. En escriptori això implica gestionar un búfer de sortida compartit que també transporta els motors de vibració i les dades LED — actualitzar el camp del disparador sense cura esborra l'estat de vibració del fotograma anterior. En hardware PS5 l'API és completament diferent: scePadSetTriggerEffect amb ScePadTriggerEffectParam, capçaleres SDK sota llicència que no poden viatjar amb el repositori i un devkit per provar. Gestionar ambdues rutes al codi del joc és una càrrega de manteniment.

Més enllà de la capa de transport, el model d'efecte ha de ser accessible per als dissenyadors. Posició d'inici, posició de fi, força, costat del disparador, mode i durada necessiten camps d'inspector, validació de rang i una manera de combinar-se amb altres modalitats de feedback en el mateix asset. Construir tot això des de zero a cada projecte és duplicació que acaba sent costosa.

Com ho aborda Serenity

Serenity modela l'efecte com AdaptiveTriggerEffect amb sis camps: AdaptiveTriggerSide (Left, Right o Both), AdaptiveTriggerMode (Off, Resistance o Weapon), StartPosition01, EndPosition01, Strength01, DurationSeconds i HaveExitTime. Tots els valors normalitzats van de 0 a 1. L'efecte es defineix a l'inspector com AdaptiveTriggerEffectAuthoring dins d'un ScriptableObject FeedbackDefinition i es converteix a l'efecte pur en temps d'execució.

En temps d'execució, AdaptiveTriggerChannel rep l'efecte i el delega a IAdaptiveTriggerBackend. En escriptori, la implementació registrada és PcHidAdaptiveTriggerBackend, que tradueix l'efecte i l'envia a través del DualSenseOutputWriter compartit — el mateix writer que gestiona l'estat de vibració i LED, de manera que els tres canals mai es sobreescriuen entre si. El backend per defecte és NullAdaptiveTriggerBackend (un no-op) fins que es registra un backend real, cosa que significa que les plataformes no compatibles simplement no fan res sense necessitat de branques al codi del joc.

Com encaixa a Serenity

La funcionalitat de disparador adaptatiu forma part del sistema Feedback més ampli de Serenity. AdaptiveTriggerEffect i els seus enums viuen al namespace Serenity.Feedback.Application.Effects — C# pur sense dependències de Unity. AdaptiveTriggerChannel implementa IFeedbackChannel i resideix a la capa d'infraestructura al costat dels canals de vibració, LED, screen shake i hit stop. La seam del backend IAdaptiveTriggerBackend separa el canal del transport: PcHidAdaptiveTriggerBackend per a USB HID en escriptori, Ps5SdkAdaptiveTriggerBackend com a scaffold per a builds UNITY_PS5 i NullAdaptiveTriggerBackend com a no-op per defecte.

PcHidAdaptiveTriggerBackend mapeja cada AdaptiveTriggerMode a l'efecte de disparador DualSense corresponent: Resistance aplica una força contínua des de la posició d'inici, Weapon afegeix un punt de ruptura entre les posicions d'inici i fi, i Off neteja l'efecte. Totes les escriptures passen per DualSenseOutputWriter.TrySetTrigger, que manté la sortida per dispositiu sincronitzada perquè l'estat de vibració i LED mai es corrompui. Quan HaveExitTime és true, el canal programa una corrutina que reseteja el disparador després de DurationSeconds (en temps real); quan HaveExitTime és false, l'efecte persisteix fins que un altre efecte — normalment un en mode Off — el sobreescriu.

Flux de treball pràctic

  1. Crea un ScriptableObject FeedbackDefinition i afegeix una entrada AdaptiveTriggerEffectAuthoring a la seva llista d'efectes.
  2. Configura Side (Left, Right o Both), Mode (Resistance o Weapon), StartPosition, EndPosition, Strength, DurationSeconds i si l'efecte ha d'auto-restablir-se mitjançant HaveExitTime.
  3. Registra el FeedbackDefinition al servei de feedback a través de la pipeline d'inicialització.
  4. Reprodueix l'efecte en temps d'execució cridant IFeedbackService.Play("el-teu-id") o enviant una PlayFeedbackSignal des de qualsevol sistema o element d'UI.
  5. Per adreçar-se al pad d'un jugador específic, passa un FeedbackTarget amb abast a l'índex d'aquell jugador o a l'acting pad — el canal resol el dispositiu DualSense correcte automàticament.
  6. Per aturar un efecte persistent actiu abans de la seva sortida natural, crida IFeedbackService.Stop("el-teu-id") o reprodueix un efecte en mode Off al mateix costat.

Què inclou

  • AdaptiveTriggerEffect amb AdaptiveTriggerSide (Left/Right/Both) i AdaptiveTriggerMode (Off/Resistance/Weapon)
  • Camps normalitzats 0–1 per a StartPosition01, EndPosition01 i Strength01, escalats per la intensitat global de feedback
  • Auto-reset temporitzat mitjançant HaveExitTime i DurationSeconds, o mode persistent fins a ser sobreescrit
  • PcHidAdaptiveTriggerBackend gestiona DualSense sobre USB HID en escriptori i a l'editor de Unity
  • El DualSenseOutputWriter compartit garanteix que les actualitzacions de disparador mai corrompuin l'estat de vibració o LED en el mateix report de sortida
  • NullAdaptiveTriggerBackend per defecte manté en silenci les plataformes no compatibles sense cap branca al codi del joc
  • Scaffold Ps5SdkAdaptiveTriggerBackend per a builds UNITY_PS5, llest per completar en devkit
  • AdaptiveTriggerEffectAuthoring per a la definició a l'inspector dins de ScriptableObjects FeedbackDefinition

Quan fer-lo servir

  • Jocs dirigits a PS5 o DualSense en PC que vulguin resistència de tret, tensió d'arc o fricció de superfície a través dels disparadors adaptatius.
  • Projectes que ja usen el sistema Feedback de Serenity per a vibració, LED o screen shake i volen afegir disparadors adaptatius sense una integració HID separada.
  • Equips que volen que els dissenyadors defineixin els efectes de disparador com a dades en lloc de programar reports de sortida de comandament a mà.
  • Bases de codi que necessiten que la mateixa crida de feedback funcioni a DualSense, DualShock 4 i altres comandaments — el backend null gestiona els dispositius no DualSense en silenci.

Sistemes relacionats

Utilitza Serenity quan vulguis disparadors adaptatius DualSense definits com a dades, lliurats a través del mateix servei de feedback que gestiona vibració i LED, i aïllats dels detalls HID i SDK a cada plataforma.

Tornar a la pàgina principal