using System.Collections; using System.Collections.Generic; using UnityEngine; using BehaviorDesigner.Runtime; using BehaviorDesigner.Runtime.Tasks; namespace BehaviorDesigner.Runtime.Tasks { /// /// 行为 攻击 /// public class ActionAttack : Action { [Tooltip("攻击目标")] public SharedTransform target; [BehaviorDesigner.Runtime.Tasks.Tooltip("攻击条件")] public AttackCondition attackCondition = new AttackCondition(); [BehaviorDesigner.Runtime.Tasks.Tooltip("animator的攻击触发器开关")] public SharedString attackTriggerName = "Attack1"; [BehaviorDesigner.Runtime.Tasks.Tooltip("攻击条件成功后,等待时间多少时间离开此状态")] public SharedFloat waitTime = 2; [BehaviorDesigner.Runtime.Tasks.Tooltip("是否随机攻击")] public bool randomAttack = false; [BehaviorDesigner.Runtime.Tasks.Tooltip("失败是否自动继续执行后面逻辑")] public bool failAutoNext = false; [BehaviorDesigner.Runtime.Tasks.Tooltip("随机攻击攻击的触发器开关集合,随机攻击开启后会在列表内随机使用其中一个攻击,randomAttack为false时无效")] public List randomAttackTriggerNames = new List(); /// /// 开始时间 /// private float startTime; /// /// 动画控制器 /// private Animator animator = null; /// /// 攻击条件是否达成 /// private bool attackConditionSuccess = false; private Role role = null; public override void OnAwake() { animator = gameObject.GetComponentInChildren(); role = gameObject.GetComponent(); } public override void OnStart() { startTime = Time.time; role.attacking = true; if (target.Value == null) { attackConditionSuccess = false; return; } switch (attackCondition.condition) { case eAttackCondition.None: { attackConditionSuccess = true; } break; case eAttackCondition.Distance: { float dis = Vector3.Distance(transform.position, target.Value.transform.position); if (dis >= attackCondition.conditionMinValue && dis < attackCondition.conditionMaxValue) { attackConditionSuccess = true; } else { attackConditionSuccess = false; return; } } break; case eAttackCondition.HpPercentage: { Role selfRole = transform.GetComponent(); float hpPerc = selfRole.mData.HP_Final / selfRole.mData.MaxHP_Final; if (hpPerc >= attackCondition.conditionMinValue && hpPerc < attackCondition.conditionMaxValue) { attackConditionSuccess = true; } else { attackConditionSuccess = false; return; } } break; } // 随机攻击 if (randomAttack) { int randomVal = Random.Range(0, randomAttackTriggerNames.Count); animator.SetBool(randomAttackTriggerNames[randomVal], true); } else { animator.SetBool(attackTriggerName.Value, true); } // 朝向目标攻击 Vector3 targetPos = target.Value.position; targetPos.y = transform.position.y; transform.LookAt(targetPos); //// 缓慢旋转 //Vector3 dir = target.Value.position - transform.position; //dir.Normalize(); //transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), 60 * Time.deltaTime); } public override TaskStatus OnUpdate() { if (attackConditionSuccess == false) { if (failAutoNext) { return TaskStatus.Success; } else { return TaskStatus.Failure; } } if (startTime + waitTime.Value < Time.time) { return TaskStatus.Success; } return TaskStatus.Running; } /// /// 结束 /// public override void OnEnd() { role.attacking = false; } } /// /// 攻击条件 /// public enum eAttackCondition { /// /// 无 /// None = 0, /// /// 距离(实际距离) /// Distance = 1, /// /// 血量百分百(0~1) /// HpPercentage = 2, } /// /// 攻击条件 /// public class AttackCondition { [BehaviorDesigner.Runtime.Tasks.Tooltip("攻击条件类型")] public eAttackCondition condition = eAttackCondition.None; [BehaviorDesigner.Runtime.Tasks.Tooltip("攻击条件最小值")] public float conditionMinValue = 0; [BehaviorDesigner.Runtime.Tasks.Tooltip("攻击条件最大值")] public float conditionMaxValue = 0; } }