我想在Unity上创建一个复杂的技能/能力系统,该系统可能有一些条件可以触发独特的行为等。例如,我有一个名为“碎裂”的技能,会造成伤害并具有一定条件:如果敌人当前正在流血,则施加护甲断裂。如果敌人的盔甲破损,则应用流血。如果两者都影响,则应用更多的出血点。这只是我希望自己的技能具有哪种行为/条件的一个例子。
我已经创建了一个,并使其能够处理大量的预制件,实例化和单行为/继承性混乱,但是它向我展示了一些我无法解决的问题,所以现在我尝试使用可脚本化对象和我决定暂时重写游戏。
这就是我用来使Shatter(从WarriorSkill继承而来,继承自Skill)与monobehaviour / inheritance结合使用的情况(在此示例中,条件只是减益):
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);
}
}
因此,我需要适应一些预制实例化/序列化限制,例如,我无法将出血和凝血预制件拖放到出血预制件上,因为当我实例化它时,它显示为空。我得到的那些“不好的解决方案”并没有使我满意,并且在编写代码时出现了更多的问题。因此,现在我正在尝试使用可编写脚本的对象来修复和改进代码。重要的是要注意,每项技能都有一些非常特殊的功能/条件和独特的行为,例如“破碎”能力。如有必要,我可能会描述更多示例。