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); } } } }