using Adon.Game.BO;
using Adon.Game.Helper;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AdonGameKit
{
///
/// 言灵星空法阵爆炸
///
public class YLStarrySkyBomb : MonoBehaviour
{
///
/// 爆炸范围
///
public float m_AttackSight = 4;
///
/// 爆炸角度
///
public float m_AttackAngle = 360;
[SerializeField]
private BaseYLPartAdon m_YL;//释放者挂件(言灵)
[SerializeField]
private BaseHero m_Hero;
[SerializeField]
private Transform m_BombEff;
float m_FireTimeMax = 0.6f;//发射周期
[SerializeField]
private string m_CurUseSkill;
float fireTime;
bool isFire;
//上次检测怪
List LastMonsters = new List();
List CurrentMonsters = new List();
List CleanMonsters = new List();
///
/// 初始化
///
/// 释放者挂件(言灵)
/// 释放者(英雄)
/// 目标点
/// 当前技能ID
public void init(BaseYLPartAdon _YL, BaseHero _hero, Transform _BombEff, string _CurUseSkill)
{
m_YL = _YL;
m_Hero = _hero;
m_BombEff = _BombEff;
m_CurUseSkill = _CurUseSkill;
}
void Awake()
{
fireTime = m_FireTimeMax;
}
// Start is called before the first frame update
void Start()
{
gameObject.GetComponentInChildren().SetOwner(this.gameObject);//设置事件类拥有者
}
private void Update()
{
if (isFire)
{
//计时,周期发送伤害
if (fireTime >= m_FireTimeMax)
{
fireTime = 0;
///检测范围内的怪
CurrentMonsters = PlayerHelperAdon.GetNearMonsters(m_AttackSight, m_AttackAngle, gameObject);
for (int i = 0; i < CurrentMonsters.Count; i++)
{
BaseMonsterAdon monster = CurrentMonsters[i].GetComponent();
//X2Battle.X2BattleManager.Instance.mBulletModel.OnCastSkill(
// m_Hero.mData.UID, m_CurUseSkill,
// false, m_YL.M_YLType, monster.mData.UID, false);
BulletMessage.catSkillFun(m_Hero.mData.UID, m_CurUseSkill,
false, (int)m_YL.M_YLType, monster.mData.UID, false);
//实例化克隆爆炸光效
Transform effobj = Instantiate(m_BombEff);
effobj.position = monster.m_HitObj.position;//设置爆炸位置
effobj.gameObject.SetActive(true);
//给星云旋涡内对敌人施加吸力
Vector3 force = transform.position - monster.transform.position;//推力方向
monster.m_RigidbodyTimeline3D.velocity = force * 2.5f;//吸力速度
//敌人播放移动动作
//敌人看向外围方向
//暂停AI行为树
monster.CurrentBehaviorTree.DisableBehavior(true);
//计算吸力角度
//比对之前的怪列表,清理之前的怪
//for (int l = 0; l < LastMonsters.Count; i++)
//{
// //移除相同怪
// if (monster == LastMonsters[l])
// {
// LastMonsters.RemoveAt(l);
// break;
// }
//}
}
//比对之前的怪列表,清理之前的怪
for (int i = 0; i < LastMonsters.Count; i++)
{
bool isCurren = true;
GameObject temp = LastMonsters[i];
for (int l = 0; l < CurrentMonsters.Count; l++)
{
if (temp == CurrentMonsters[i])
{
isCurren = false;
}
}
if (isCurren)
{
CleanMonsters.Add(temp);//添加进清理列表
//清理debuff,恢复正常
BaseMonsterAdon monster = CleanMonsters[i].GetComponent();
monster.CurrentBehaviorTree.EnableBehavior();
}
}
//for (int i = 0; i < CleanMonsters.Count; i++)
//{
// //清理debuff,恢复正常
// BaseMonsterAdon monster = CleanMonsters[i].GetComponent();
// monster.CurrentBehaviorTree.EnableBehavior();
//}
}
fireTime += Time.deltaTime;
LastMonsters = CurrentMonsters;
}
}
//public void SetHero(BaseHero _hero)
//{
// m_Hero = _hero;
//}
//public void SetBombEff(Transform _bombEff)
//{
// m_BombEff = _bombEff;
//}
/////
/// 攻击触发
///
/// 子连击id
public void OnAttackOn(string attackId)
{
isFire = true;
}
public void OnAttackOff()
{
isFire = false;
//释放被吸对象AI行动
for(int i = 0;i< CurrentMonsters.Count;i++)
{
BaseMonsterAdon monster = CurrentMonsters[i].GetComponent();
monster.CurrentBehaviorTree.EnableBehavior();
}
}
#if UNITY_EDITOR
///
/// 绘制打击配置
///
private void OnDrawGizmosSelected()
{
Vector3 forward = transform.forward;
UnityEditor.Handles.color = new Color(1.0f, 0.0f, 0.0f, 0.1f);
Vector3 rotatedForward = Quaternion.Euler(0, -m_AttackAngle * 0.5f, 0) * transform.forward;
UnityEditor.Handles.DrawSolidArc(transform.position, Vector3.up, rotatedForward, m_AttackAngle, m_AttackSight);
}
#endif
}
}