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