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("Бой")] 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 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); 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); arrowShowDuration = Mathf.Max(0.05f, arrowShowDuration); arrowHideDuration = Mathf.Max(0.05f, arrowHideDuration); } } }