QualitySettingsPackage/Packages/com.bywaystudios.qualitytuner/Runtime/RuleBasedQualitySelector.cs
2026-04-28 17:03:25 +08:00

54 lines
1.7 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace Byway.Quality
{
public class RuleBasedQualitySelector<T>
{
public RuleBasedQualitySelector(T defaultQualityLevel, IEnumerable<IMatcher> qualityLevelRuleMatchers)
{
DefaultQualityLevel = defaultQualityLevel;
QualityLevelRuleMatchers = new List<IMatcher>(qualityLevelRuleMatchers);
}
public RuleBasedQualitySelector(QualityRuleData<T> data) : this(data.defaultQualityLevel,
data.qualityLevelRuleMatchers)
{
}
public List<IMatcher> QualityLevelRuleMatchers { get; }
public T DefaultQualityLevel { get; set; }
public bool TryGetQualityLevel(HardwareStats stats, out T qualityLevel)
{
if (QualityLevelRuleMatchers is not null)
foreach (var matcher in QualityLevelRuleMatchers)
{
if (matcher == null)
continue;
if (matcher.TryMatch<T>(stats, out var matchedQualityLevel))
{
qualityLevel = matchedQualityLevel;
return true;
}
}
qualityLevel = DefaultQualityLevel;
return false;
}
}
public abstract class QualityRuleData<T> : ScriptableObject
{
[Tooltip("Default quality level if no match")]
public T defaultQualityLevel;
[Tooltip("Combined performance index table")]
[SerializeReference]
[SelectableSerializeReference]
public IMatcher[] qualityLevelRuleMatchers; // cannot use IMatcher<T> because of SerializeReference
}
}