Screen Shake, Hit Stop i Screen Flash
Screen shake, camera shake, UI shake, hit stop i flaix a pantalla completa — tot creat en un FeedbackDefinition i disparat amb una única crida al servei.
Per a què serveix aquest sistema
El game feel viu en els detalls: el fotograma en què la càmera sacseja amb un cop fort, la fracció de segon de congelació que fa que l'impacte se senti real, el flaix blanc que indica al jugador que acaba de passar alguna cosa important. Aquests efectes són senzills per separat, però difícils de coordinar. Cada un afecta un sistema diferent — la càmera, Time.timeScale, un canvas overlay — i tots necessiten posar-se d'acord sobre la intensitat, el timing i l'estat de pausa.
Els canals de screen feedback de Serenity modelen cada efecte com un canal de primera classe que flueix pel mateix pipeline d'IFeedbackService que el rumble del gamepad i els adaptive triggers. Un ScriptableObject FeedbackDefinition els barreja tots. Una crida a IFeedbackService.Play dispara el conjunt complet.
El problema a Unity
Implementar screen shake implica enganxar-se a la càmera activa a cada fotograma i aplicar un offset posicional que no lluiti amb el controlador de càmera que ja estigui en marxa. El hit stop implica baixar Time.timeScale sense trencar un joc pausat. El screen flash implica crear un canvas overlay a pantalla completa i animar el seu alpha fora del temps escalat perquè segueixi sent visible durant el stop. El UI shake implica trobar tots els canvas arrel i desplaçar-los en espai de pantalla sense tocar els objectes en espai món. Cap d'aquests problemes és difícil de forma aïllada, però cablar-los a una configuració d'intensitat comuna, a un gestor de pausa global i a la mateixa superfície d'edició requereix un esforç real.
Sense una capa compartida, aquests efectes s'acostumen a implementar de forma ad hoc: una corrutina aquí, un helper estàtic allà, un número màgic incrustat en un script. El resultat són efectes que ignoren la configuració d'intensitat global d'accessibilitat, que lluiten amb el gestor de pausa o que deixen canvas orfes a la jerarquia.
Com ho aborda Serenity
Serenity defineix tres objectes de valor d'efecte — ScreenFlashEffect (Color, PeakAlpha, DurationSeconds, AnimationCurve opcional), ScreenShakeEffect (Amplitude, Frequency, DurationSeconds) i UiScreenShakeEffect (mateixa forma que ScreenShakeEffect però dirigit a l'espai d'UI) — i HitStopEffect (TargetTimeScale, DurationSeconds). Cada un correspon a un canal dedicat que s'encarrega del cablejat específic de Unity: ScreenFlashChannel crea de forma diferida un canvas FeedbackScreenOverlay i el gestiona amb temps no escalat; ScreenShakeChannel adjunta automàticament un UnityCameraShakeApplier a la càmera activa i la re-resol cada fotograma per sobreviure a les transicions de càmera; UiScreenShakeChannel descobreix els canvas arrel a través de UiShakeRegistry i gestiona els components UnityUiShakeReceiver adjunts a ells de forma automàtica; HitStopChannel baixa Time.timeScale i el restaura, protegint contra conflictes amb el gestor de pausa mitjançant IGameModeService.IsPaused.
Els quatre efectes es creen dins del mateix ScriptableObject FeedbackDefinition juntament amb rumble de gamepad, color LED i efectes d'adaptive trigger. AnimationCurveFeedbackCurve embolcalla UnityEngine.AnimationCurve darrere d'una interfície IFeedbackCurve perquè la capa d'Aplicació es mantingui lliure de tipus del motor. El camera shake i el UI shake escalen amb l'ajust d'intensitat global d'IFeedbackSettings, donant als jugadors un slider d'accessibilitat per a la intensitat visual. El hit stop ignora deliberadament la intensitat global perquè el timing de gameplay es mantingui determinista.
Com encaixa a Serenity
El screen feedback viu al namespace Serenity.Feedback i segueix l'estructura per capes de la foundation. La capa d'Aplicació defineix ScreenFlashEffect, ScreenShakeEffect, UiScreenShakeEffect i HitStopEffect com a objectes de dades simples, IFeedbackCurve com a abstracció d'envoltant, i IFeedbackService com a punt de disparo únic. La capa d'Infraestructura proporciona les implementacions de canal de Unity: ScreenFlashChannel, ScreenShakeChannel, UiScreenShakeChannel i HitStopChannel, més el MonoBehaviour FeedbackScreenOverlay, UnityCameraShakeApplier i UnityUiShakeReceiver. FeedbackDefinition és el ScriptableObject que conté la llista d'efectes creada i que UnityFeedbackDefinitionProvider resol en temps d'execució.
El screen feedback coopera amb altres tres sistemes de Serenity. L'agregat d'UI proporciona el descobriment de canvas arrel que UiScreenShakeChannel usa a través de UiShakeRegistry. Game Mode proporciona l'estat de pausa que HitStopChannel comprova abans de baixar timeScale. L'Event Dispatcher permet que qualsevol sistema dispari un PlayFeedbackSignal sense dependre directament d'IFeedbackService, perquè els dissenyadors puguin connectar el feedback a esdeveniments de joc a l'inspector sense tocar el codi.
Flux de treball pràctic
- Crea un asset ScriptableObject FeedbackDefinition al teu projecte.
- Afegeix un ScreenShakeEffect, UiScreenShakeEffect, ScreenFlashEffect o HitStopEffect — o qualsevol combinació — a la llista d'efectes.
- Estableix els valors d'amplitud, freqüència, durada i color directament a l'inspector; opcionalment assigna un AnimationCurveFeedbackCurve per donar forma a l'envoltant.
- Registra la definició amb el servei de feedback a través de la pipeline d'inicialització.
- Crida IFeedbackService.Play("el-teu-id-de-definició") des de codi, o connecta un PlayFeedbackSignal a un binding de l'Event Dispatcher per disparar-lo sense codi.
- Ajusta el paràmetre d'intensitat global a IFeedbackSettings per escalar el camera shake i el UI shake a totes les definicions alhora per a accessibilitat.
Què inclou
- ScreenFlashEffect — flaix RGB a pantalla completa amb PeakAlpha i AnimationCurve opcional, gestionat amb temps no escalat perquè sigui visible durant el hit stop
- ScreenShakeEffect — vibració posicional de càmera amb Amplitude, Frequency i DurationSeconds; offset aplicat de forma additiva per sobreviure a qualsevol controlador de càmera
- UiScreenShakeEffect — canal de shake d'UI/HUD/menú independent en espai de pantalla, separat del camera shake perquè menús i càmera món no entrin en conflicte
- HitStopEffect — baixada breu de Time.timeScale amb TargetTimeScale i DurationSeconds; conscient de pausa i exclòs deliberadament de l'escalat d'intensitat global
- ScreenFlashChannel — instancia de forma diferida un canvas FeedbackScreenOverlay; sense configuració manual necessària
- ScreenShakeChannel — adjunta automàticament UnityCameraShakeApplier a la càmera activa i la re-resol cada fotograma per a major seguretat en transicions de càmera
- UiScreenShakeChannel — descobreix automàticament els canvas arrel mitjançant UiShakeRegistry i adjunta UnityUiShakeReceiver sense cablejat manual
- Un únic ScriptableObject FeedbackDefinition barreja efectes de pantalla amb rumble de gamepad, LED i efectes d'adaptive trigger; un IFeedbackService.Play els dispara tots
Quan fer-lo servir
- Jocs que necessiten reaccions d'impacte contundents — combat cos a cos, tirs, explosions — i volen que el screen shake, el flaix i el hit stop es disparin com un conjunt coordinat.
- Projectes que ja usen el sistema Feedback de Serenity per al rumble del gamepad i volen estendre les mateixes definicions per cobrir efectes de pantalla sense codi addicional.
- Equips que volen que els efectes d'intensitat visual respectin un ajust d'accessibilitat perquè els jugadors puguin reduir o desactivar el shake i el flaix de forma global.
- Bases de codi on els dissenyadors necessiten ajustar i disparar efectes de feedback des de l'inspector sense modificar scripts.
Sistemes relacionats
Utilitza el screen feedback de Serenity quan vulguis que el camera shake, el UI shake, el screen flash i el hit stop convisquin en el mateix ScriptableObject, escalen amb un únic slider d'accessibilitat i es disparin amb una sola crida al servei — sense tocar directament el controlador de càmera, la jerarquia de canvas ni Time.timeScale.
English
Español
Català