Rumble de Gamepad i Il·luminació de Controlador

Un únic servei de feedback que controla el rumble de doble motor, el color del lightbar LED i la vibració HD del Switch Pro a PS5, PS4, Nintendo Switch Pro i controladors genèrics.

Per a què serveix aquest sistema

L'output de gamepad a Unity sembla senzill fins que es publica en una segona plataforma. SetMotorSpeeds esborra el color del lightbar. SetLightBarColor cancel·la la sortida del motor. L'output per Bluetooth és silenciosament inert als controladors PlayStation. La vibració HD del Switch Pro i el LED del botó Home no tenen cap API a Unity. Qualsevol equip que hagi publicat un joc amb controlador ha trobat com a mínim un d'aquests bugs.

El sistema Feedback de Serenity gestiona l'informe HID complet de cada família de controladors i exposa-ho tot a través d'un únic IFeedbackService. Es poden reproduir efectes per id, adreçar-los a jugadors o dispositius concrets, escalar la intensitat globalment des dels ajustos i disparar qualsevol efecte sense codi a través de l'Event Dispatcher, sense haver de tocar els detalls del driver de cada plataforma.

El problema a Unity

L'API Gamepad de Unity exposa SetMotorSpeeds i SetLightBarColor com dues crides separades, però el controlador rep en realitat un únic informe de sortida compartit. Escriure les velocitats del motor sobreescriu el lightbar i viceversa. A més, el path d'output de Unity és inert per Bluetooth a DualSense i DualShock 4, i la vibració HD del Switch Pro és completament absent de l'API de Unity. Els projectes que necessiten tant rumble com feedback LED en més d'una plataforma acaben escrivint pedaços fràgils per plataforma que es trenquen a cada actualització de Unity.

Els jocs multijugador s'enfronten a un segon problema: Gamepad.current és ambigu quan hi ha diversos controladors connectats. Saber quin controlador físic va disparar l'última acció —i per tant quin ha de vibrar— requereix un seguiment explícit del dispositiu actiu. Sense això, el rumble o bé es reprodueix al controlador equivocat o es desactiva completament per evitar el bug.

Com ho aborda Serenity

IFeedbackService és el punt d'entrada únic: Play(id) dispara un efecte per id al dispositiu actiu, PlayForPlayer(playerIndex, id) i PlayForDevice(deviceId, id) s'adrecen a objectius concrets, PlayForPlayerInput(playerInput, id) s'integra amb el component PlayerInput de Unity, StopAll() cancel·la els efectes actius, i SetGlobalEnabled(bool) i SetGlobalIntensity(float) apliquen els ajustos d'accessibilitat en temps real. Els efectes s'envien a implementacions d'IFeedbackChannel: VibrationChannel gestiona el rumble de doble motor mitjançant VibrationEffect (amplitud baixa i alta de manera independent), i LedChannel gestiona el color del lightbar mitjançant LedEffect.

L'adreçament multijugador es gestiona mitjançant FeedbackTarget, que pot representar el controlador actiu, un índex de jugador o un id de dispositiu. UnityGamepadTargetResolver mapeja aquests objectius a dispositius físics, i IActingDeviceTracker registra quin gamepad connectat va disparar l'última acció, eliminant l'ambigüitat de Gamepad.current. FeedbackScaler llegeix vibration_enabled i vibration_intensity de GameSettings i els aplica en temps real perquè les preferències d'accessibilitat tinguin efecte sense necessitat de reiniciar els efectes.

Com encaixa a Serenity

El sistema Feedback viu al namespace Serenity.Feedback i segueix l'estructura per capes de la foundation. La capa Business defineix IFeedbackService, IFeedbackChannel, IFeedbackEffect, FeedbackTarget, VibrationEffect, LedEffect i FeedbackScaler darrere d'interfícies estables. La capa Unity proporciona els backends HID: DualSenseOutputWriter per a PS5, DualShock4OutputWriter per a PS4 i SwitchProVibrationService per a la vibració HD del Nintendo Switch Pro, transmesa en un fil en segon pla a aproximadament 100 Hz. Els controladors genèrics utilitzen com a fallback el Gamepad.SetMotorSpeeds de Unity. La capa HID inclou RawHidDevice i GamepadHidrawTransport per a l'accés directe al dispositiu, a més de GamepadHardwareIds, que identifica cada família de controlador compatible, amb el tractament addicional que els controladors PlayStation requereixen per Bluetooth. Aquest sistema és només de sortida — l'entrada de moviment per giroscopi i acceleròmetre d'aquests mateixos DualSense, DualShock 4 i Switch Pro viu al sistema Player Input.

La compatibilitat de plataformes abasta Windows (USB mitjançant ExecuteCommand, Bluetooth mitjançant HID raw), Linux (tot l'output mitjançant hidraw, amb regles udev necessàries) i macOS (només USB). L'autoria utilitza ScriptableObjects de FeedbackDefinition que agrupen efectes i es referencien per id. Els disparaments sense codi estan disponibles mitjançant PlayFeedbackSignal a través de l'Event Dispatcher. El sistema coopera amb PlayerInput per a la resolució de jugadors i dispositius, amb GameSettings per a l'escalat d'intensitat en temps real i amb l'Event Dispatcher per als disparaments basats en senyals.

Flux de treball pràctic

  1. Crea un ScriptableObject FeedbackDefinition i afegeix entrades VibrationEffect i LedEffect amb les amplituds i colors que necessitis.
  2. Assigna la definició al projecte i referencia-la per id on vulguis disparar el feedback.
  3. Deixa que l'instal·lador de feedback registri IFeedbackService i tots els canals a través de la pipeline d'inicialització.
  4. Fes servir IActingDeviceTracker per saber quin gamepad va disparar l'última acció i resol-lo a través de FeedbackTarget.
  5. Crida IFeedbackService.Play(id) des del codi de gameplay o despatxa PlayFeedbackSignal des de l'Event Dispatcher per a disparaments sense codi.
  6. Configura vibration_enabled i vibration_intensity a GameSettings perquè FeedbackScaler apliqui les preferències d'accessibilitat en temps real.

Què inclou

  • Punt d'entrada únic IFeedbackService amb Play, PlayForPlayer, PlayForDevice, PlayForPlayerInput, StopAll, SetGlobalEnabled i SetGlobalIntensity
  • VibrationEffect amb control independent del motor de baixa amplitud i alta amplitud enviat mitjançant VibrationChannel
  • LedEffect per al color RGB del lightbar enviat mitjançant LedChannel
  • Gestió completa de l'informe HID: DualSenseOutputWriter (PS5), DualShock4OutputWriter (PS4), SwitchProVibrationService (Switch Pro)
  • Suport Bluetooth mitjançant una capa de HID raw per a controladors PlayStation
  • Vibració HD del Switch Pro transmesa en un fil en segon pla a ~100 Hz més LED monocrom del botó Home
  • Adreçament multijugador mitjançant FeedbackTarget, UnityGamepadTargetResolver i IActingDeviceTracker
  • FeedbackScaler connectat a vibration_enabled i vibration_intensity de GameSettings per a control d'accessibilitat en temps real
  • Disparament sense codi mitjançant PlayFeedbackSignal a través de l'Event Dispatcher

Quan fer-lo servir

  • Projectes que necessiten output de rumble i LED a PS5, PS4 o Nintendo Switch Pro i han trobat el bug de sobreescriptura motor/lightbar de Unity.
  • Jocs que es publiquen a Linux o que necessiten output de gamepad per Bluetooth que el path per defecte de Unity no entrega.
  • Jocs multijugador que han de vibrar el controlador correcte quan hi ha diversos gamepads connectats.
  • Bases de codi que volen control global d'intensitat i activació compatible amb l'accessibilitat sense condicionals a cada punt d'ús.

Sistemes relacionats

Fes servir el sistema Feedback de Serenity quan necessitis un output de gamepad fiable en diferents famílies de controladors i plataformes, amb una única crida a un servei com a únic punt d'integració que el codi de gameplay necessita conèixer.

Tornar a la pàgina principal