Newer
Older
HardPoint-Project-Abertay-University-Unity3D / Assets / Scripts / FSM / Actions / AttackAction.cs
using UnityEngine;

[CreateAssetMenu(menuName = "AI/Action/Attack")]
public class AttackAction : Action
{
    [SerializeField]
    private float maxheight;
    [SerializeField]
    private float veloctiy;

    public override void Act(FiniteStateMachine fsm)
    {
        if (!fsm.dic.HasKey("movement")) fsm.dic.SetValue("movement", fsm.GetComponent<IMovable>());
        if (!fsm.dic.HasKey("rb")) fsm.dic.SetValue("rb", fsm.GetComponent<Rigidbody>());
        if ((fsm.dic.GetValue("movement") as IMovable).GetVelocity().y <= 0 && !fsm.dicVecs.HasKey("groundPoint"))
        {
            fsm.dicVecs.SetValue("groundPoint", fsm.transform.position);
            (fsm.dic.GetValue("movement") as IMovable).ChangeVelocity(Vector3.up * veloctiy);
            (fsm.dic.GetValue("rb") as Rigidbody).useGravity = false;
        }
        if (fsm.dicVecs.HasKey("groundPoint"))
        {
            if (Vector3.Distance(fsm.dicVecs.GetValue("groundPosition"), fsm.transform.position) >= maxheight)
            {
                fsm.dicBools.SetValue("Attacking", true);
                Vector3 dir = Vector3.Normalize(fsm.GetTarget().transform.position - fsm.transform.position) * veloctiy;
                if (!fsm.dic.HasKey("KnockBack")) fsm.dic.SetValue("KnockBack", -dir / 2);
                (fsm.dic.GetValue("movement") as IMovable).ChangeVelocity(dir);
            }
        }
    }
}