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