Как правильно реализовать целевые требования в игре?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильно реализовать целевые требования в игре?

Сообщение Anonymous »

Я новичок-самоучка, учусь методом проб и ошибок. Я работаю над карточной игрой на Unity (C#) и пытаюсь разработать понятную и расширяемую систему для проверки целей во время игры.
Сейчас я разделил концепцию «целевых требований» на два уровня:
  • Код: Выделить всё

    ITargetRequirementConfig
    : данные конфигурации, которые можно сериализовать и редактировать перед выполнением.
  • Код: Выделить всё

    ITargetRequirement
    : экземпляры среды выполнения, создаваемые динамически из конфигурации. У них есть метод IsValid(target, context)
Вот упрощенная версия моей текущей настройки — уровень времени выполнения:

Код: Выделить всё

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);
}
}
Мой вопрос: как лучше всего создать экземпляр ITargetRequirement из конфигурации?
Вот варианты, которые я рассматриваю:
  • Создать RequirementFactory, который принимает конфигурацию и использует переключатель, чтобы решить, какой экземпляр среды выполнения создавать
  • Пусть ITargetRequirementConfig.BuildRuntime() принять фабрику и делегировать ей создание.
  • Полностью пропустите фабрику и позвольте каждому классу конфигурации напрямую возвращать свой собственный экземпляр среды выполнения.
  • Откажитесь от этого проекта и начните заново — может быть, он перепроектирован?
Любые советы, шаблоны или критические замечания приветствуются. Меня особенно интересует, как другие обрабатывают логику проверки времени выполнения в играх или подобных системах.
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... ts-in-game
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»