// MIT License - Copyright (c) 2025 wallstop // Full license text: https://github.com/wallstop/unity-helpers/blob/main/LICENSE namespace WallstopStudios.UnityHelpers.Settings { using UnityEngine; using UnityEngine.Serialization; using WallstopStudios.UnityHelpers.Utils; /// /// ScriptableObject that stores default wait-instruction buffer settings. Serialized under Resources so the runtime can apply the defaults automatically. /// public sealed class UnityHelpersBufferSettingsAsset : ScriptableObject { /// /// Resource path (used with Resources.Load) where the settings asset is stored. /// public const string ResourcePath = "Wallstop Studios/Unity Helpers/UnityHelpersBufferSettings"; /// /// AssetDatabase path used by the editor to create/manage the asset. /// public const string AssetPath = "Assets/Resources/Wallstop Studios/Unity Helpers/UnityHelpersBufferSettings.asset"; internal const string ApplyOnLoadPropertyName = nameof(_applyOnLoad); internal const string QuantizationStepSecondsPropertyName = nameof( _waitInstructionQuantizationStepSeconds ); internal const string MaxDistinctEntriesPropertyName = nameof( _waitInstructionMaxDistinctEntries ); internal const string UseLruEvictionPropertyName = nameof(_waitInstructionUseLruEviction); [FormerlySerializedAs("applyOnLoad")] [SerializeField] private bool _applyOnLoad = true; [FormerlySerializedAs("waitInstructionQuantizationStepSeconds")] [SerializeField] [Min(0f)] private float _waitInstructionQuantizationStepSeconds; [FormerlySerializedAs("waitInstructionMaxDistinctEntries")] [SerializeField] [Min(0)] private int _waitInstructionMaxDistinctEntries = Buffers.WaitInstructionDefaultMaxDistinctEntries; [FormerlySerializedAs("waitInstructionUseLruEviction")] [SerializeField] private bool _waitInstructionUseLruEviction; /// /// Gets whether the defaults should be applied automatically on domain/runtime load. /// public bool ApplyOnLoad => _applyOnLoad; /// /// Gets the sanitized quantization step (0 disables quantization). /// public float QuantizationStepSeconds => SanitizeQuantization(_waitInstructionQuantizationStepSeconds); /// /// Gets the sanitized distinct entry limit (0 = unbounded). /// public int MaxDistinctEntries => SanitizeMaxDistinctEntries(_waitInstructionMaxDistinctEntries); /// /// Gets whether LRU eviction should be enabled when the cache hits the distinct entry limit. /// public bool UseLruEviction => _waitInstructionUseLruEviction; /// /// Applies the stored defaults to the Buffers wait-instruction caches. /// public void ApplyToBuffers() { Buffers.WaitInstructionQuantizationStepSeconds = QuantizationStepSeconds; Buffers.WaitInstructionMaxDistinctEntries = MaxDistinctEntries; Buffers.WaitInstructionUseLruEviction = _waitInstructionUseLruEviction; } /// /// Copies the current Buffers configuration into this asset. Useful when seeding defaults from code. /// public void SyncFromRuntime() { _waitInstructionQuantizationStepSeconds = Buffers.WaitInstructionQuantizationStepSeconds; _waitInstructionMaxDistinctEntries = Buffers.WaitInstructionMaxDistinctEntries; _waitInstructionUseLruEviction = Buffers.WaitInstructionUseLruEviction; } private static float SanitizeQuantization(float step) { if (float.IsNaN(step) || float.IsInfinity(step) || step <= 0f) { return 0f; } return step; } private static int SanitizeMaxDistinctEntries(int value) { return value < 0 ? 0 : value; } } }