Я хочу создать сложную систему навыков / умений в Unity, в которой могут быть некоторые условия для запуска уникального поведения и другие вещи.Например, у меня есть навык под названием Shatter, который наносит урон и имеет некоторые условия: если враг истекает кровью, применяет Armor Break.Если вражеская броня сломана, применяется Кровотечение.Если затронуты оба, примените больше стеков Кровотечения.Это всего лишь пример того, какой тип поведения / условий я хочу, чтобы мои навыки имели.
Я уже создал его и заставил работать с кучей префабов, созданием экземпляров и хаосом монобихевиоризма / наследования, но это показало мне некоторые проблемычто я не смог решить, поэтому сейчас я пробую Scriptable Objects и решил переписать игру на данный момент.
Это то, что я использовал для создания Shatter (наследуется от WarriorSkill, чтонаследует от Skill) работает с монобихевиоризмом / наследованием (в данном примере условия просто дебаффы):
public class Shatter : WarriorSkill, IConditionable
{
public GameObject armorBreakCondition, bleedingCondition, hemorrhageCondition, coagulationCondition;
[SerializeField] double damage;
public double Damage { get { return damage; } private set { damage = value;}
public override void OnActivate()
{
base.OnActivate();
target.TakeDamage(Damage);
bool bleeding = false;
bool armorBreak = false;
foreach(Transform condition in target.conditionsPanel.transform)
{
if (condition.GetComponent<Condition>().GetType() == typeof(Bleeding))
bleeding = true;
if (condition.GetComponent<Condition>().GetType() == typeof(CArmorBreak))
armorBreak = true;
}
if(bleeding && armorBreak)
{
FindObjectOfType<Bleeding>().AddStacks(4);
}
else if(armorBreak)
{
OnCondition(bleedingCondition);
}
else if(bleeding)
{
OnCondition2(armorBreakCondition);
}
}
private void OnCondition(GameObject condition)
{
condition.GetComponent<Bleeding>().hemorrhageCondition = hemorrhageCondition;
condition.GetComponent<Bleeding>().coagulationCondition = coagulationCondition;
target.AddCondition(condition);
}
private void OnCondition2(GameObject condition)
{
condition.GetComponent<CArmorBreak>().armorBreak = 0.25f;
condition.GetComponent<CArmorBreak>().duration = 50;
target.AddCondition(condition);
}
}
При этом мне нужно было адаптироваться к некоторым заранее подготовленным ограничениям на создание экземпляров / сериализацию, например, я не смогпросто перетащите n-drop префабов с кровоизлиянием и коагуляцией в префаб Bleeding, потому что когда я его создаю, он показывает Empty.Те «плохие решения», которые я получил, не сделали меня удовлетворенным, и когда я писал код, появлялись новые проблемы.Итак, теперь я пытаюсь исправить и улучшить свой код с помощью объектов, доступных для сценариев.Важно отметить, что у каждого навыка есть некоторые действительно особые особенности / условия и уникальное поведение, подобное этой способности Shatter.Я могу описать больше примеров, если это необходимо.