Сейчас я разделил концепцию «целевых требований» на два уровня:
- : данные конфигурации, которые можно сериализовать и редактировать перед выполнением.
Код: Выделить всё
ITargetRequirementConfig - : экземпляры среды выполнения, создаваемые динамически из конфигурации. У них есть метод IsValid(target, context)
Код: Выделить всё
ITargetRequirement
Код: Выделить всё
public interface ITargetRequirement
{
TargetSelector RequiredSelector { get; }
TargetKey TargetKey { get; }
ValidationResult IsValid(object selected, ValidationContext context);
}
public class TargetRequirement : ITargetRequirement
{
private readonly List _conditions;
public TargetSelector RequiredSelector { get; }
public TargetKey TargetKey { get; }
public TargetRequirement(List conditions, TargetSelector selector = TargetSelector.Initiator, TargetKey targetKey = default) {
RequiredSelector = selector;
TargetKey = targetKey;
_conditions = conditions ?? new List();
}
public ValidationResult IsValid(object selected, ValidationContext context) {
if (selected is not T casted)
return ValidationResult.Error($"Expected {typeof(T).Name}, got {selected?.GetType().Name ?? "null"}");
foreach (var condition in _conditions)
{
var result = condition.Validate(casted, context);
if (!result.IsValid)
return result;
}
return ValidationResult.Success;
}
}
Код: Выделить всё
public interface ITargetRequirementConfig
{
TargetKey TargetKey { get; }
string Instruction { get; }
TargetSelector RequiredSelector { get; }
ITargetRequirement BuildRuntime();
}
[System.Serializable]
public abstract class TargetRequirementConfig : ITargetRequirementConfig
{
[SerializeField]
public TargetKey targetKey = TargetKey.MainTarget;
[SerializeField]
public TargetSelector selector = TargetSelector.Initiator;
[SerializeReference]
public List conditions = new();
public TargetKey TargetKey => targetKey;
public TargetSelector RequiredSelector => selector;
public string Instruction { get; }
public ITargetRequirement BuildRuntime()
{
var runtimeConditions = conditions.Select(c => c.BuildRuntime()).ToList();
return new TargetRequirement(runtimeConditions, selector, TargetKey);
}
}
Вот варианты, которые я рассматриваю:
- Создать RequirementFactory, который принимает конфигурацию и использует переключатель, чтобы решить, какой экземпляр среды выполнения создавать
- Пусть ITargetRequirementConfig.BuildRuntime() принять фабрику и делегировать ей создание.
- Полностью пропустите фабрику и позвольте каждому классу конфигурации напрямую возвращать свой собственный экземпляр среды выполнения.
- Откажитесь от этого проекта и начните заново — может быть, он перепроектирован?
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/798 ... ts-in-game
Мобильная версия