using UnityEngine; namespace Vanguard.Battle { /// /// Длительности боевых анимаций и блокировки ввода. Ассет лежит в /// Resources/AnimationConfig; если его нет, используются значения по умолчанию. /// [CreateAssetMenu(menuName = "Vanguard/Animation Config", fileName = "AnimationConfig")] public sealed class AnimationConfig : ScriptableObject { [Header("Карты")] public float cardMoveSpeed = 14f; public float cardRotateSpeed = 12f; public float cardMoveDuration = 0.45f; public float cardFlipDuration = 0.3f; public float callMoveDuration = 0.55f; public float retireDuration = 0.8f; [Header("3D UX: движение")] public float moveDuration = 0.8f; public float importantMoveDuration = 1.3f; public float moveDelayBetweenCards = 0.22f; public float arcHeight = 0.45f; [Header("Старт боя")] public float introOverheadHold = 1.5f; public float introCameraMoveDuration = 1f; public float introMainHold = 1.5f; public float introDrawDuration = 0.6f; [Header("3D UX: камера")] public float cameraZoomDuration = 0.5f; public float vanguardRevealDuration = 0.8f; public float triggerRevealDuration = 0.35f; public float triggerRevealHold = 0.75f; public float cameraReturnDuration = 0.5f; public float cameraRezoomDuration = 0.3f; [Header("3D UX: стрелки")] public float growDuration = 0.35f; public float dashScrollSpeed = 1.5f; public float boostGrowDuration = 0.3f; public float boostThickness = 0.8f; public float arrowFadeDuration = 0.2f; [Header("Бой")] public float attackDeclare = 1.2f; public float guard = 1.9f; public float driveCheck = 1.5f; public float trigger = 1.4f; public float battleResolved = 1.3f; public float damage = 1.6f; public float heal = 1.4f; public float intercept = 1.9f; public float perfectGuard = 2.0f; [Header("Ввод")] public float inputLockTail = 0.15f; [Header("Боевые паузы")] public float eventPause = 1.5f; public float postDrivePause = 1.5f; public float postTriggerPause = 1.5f; public float postDamagePause = 1.5f; [Header("Стрелка атаки")] public float arrowShowDuration = 0.25f; public float arrowHideDuration = 0.2f; private static AnimationConfig _default; public static AnimationConfig Default { get { if (_default == null) { _default = CreateInstance(); _default.name = "AnimationConfig (runtime)"; _default.hideFlags = HideFlags.DontSave; } return _default; } } public static AnimationConfig LoadOrDefault() { var loaded = Resources.Load("AnimationConfig"); return loaded != null ? loaded : Default; } private void OnValidate() { cardMoveSpeed = Mathf.Max(1f, cardMoveSpeed); cardRotateSpeed = Mathf.Max(1f, cardRotateSpeed); cardMoveDuration = Mathf.Max(0.05f, cardMoveDuration); cardFlipDuration = Mathf.Max(0.05f, cardFlipDuration); callMoveDuration = Mathf.Max(0.05f, callMoveDuration); retireDuration = Mathf.Max(0.05f, retireDuration); moveDuration = Mathf.Max(0.05f, moveDuration); importantMoveDuration = Mathf.Max(0.05f, importantMoveDuration); moveDelayBetweenCards = Mathf.Max(0f, moveDelayBetweenCards); arcHeight = Mathf.Max(0f, arcHeight); introOverheadHold = Mathf.Max(0f, introOverheadHold); introCameraMoveDuration = Mathf.Max(0.05f, introCameraMoveDuration); introMainHold = Mathf.Max(0f, introMainHold); introDrawDuration = Mathf.Max(0.05f, introDrawDuration); cameraZoomDuration = Mathf.Max(0.05f, cameraZoomDuration); vanguardRevealDuration = Mathf.Max(0.05f, vanguardRevealDuration); triggerRevealDuration = Mathf.Max(0.05f, triggerRevealDuration); triggerRevealHold = Mathf.Max(0f, triggerRevealHold); cameraReturnDuration = Mathf.Max(0.05f, cameraReturnDuration); cameraRezoomDuration = Mathf.Max(0.05f, cameraRezoomDuration); growDuration = Mathf.Max(0.05f, growDuration); dashScrollSpeed = Mathf.Max(0f, dashScrollSpeed); boostGrowDuration = Mathf.Max(0.05f, boostGrowDuration); boostThickness = Mathf.Max(0.01f, boostThickness); arrowFadeDuration = Mathf.Max(0.05f, arrowFadeDuration); attackDeclare = Mathf.Max(0.05f, attackDeclare); guard = Mathf.Max(0.05f, guard); driveCheck = Mathf.Max(0.05f, driveCheck); trigger = Mathf.Max(0.05f, trigger); battleResolved = Mathf.Max(0.05f, battleResolved); damage = Mathf.Max(0.05f, damage); heal = Mathf.Max(0.05f, heal); intercept = Mathf.Max(0.05f, intercept); perfectGuard = Mathf.Max(0.05f, perfectGuard); inputLockTail = Mathf.Max(0f, inputLockTail); eventPause = Mathf.Max(0f, eventPause); postDrivePause = Mathf.Max(0f, postDrivePause); postTriggerPause = Mathf.Max(0f, postTriggerPause); postDamagePause = Mathf.Max(0f, postDamagePause); arrowShowDuration = Mathf.Max(0.05f, arrowShowDuration); arrowHideDuration = Mathf.Max(0.05f, arrowHideDuration); } } }