YLStarrySkyBomb.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using Adon.Game.BO;
  2. using Adon.Game.Helper;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. namespace AdonGameKit
  7. {
  8. /// <summary>
  9. /// 言灵星空法阵爆炸
  10. /// </summary>
  11. public class YLStarrySkyBomb : MonoBehaviour
  12. {
  13. /// <summary>
  14. /// 爆炸范围
  15. /// </summary>
  16. public float m_AttackSight = 4;
  17. /// <summary>
  18. /// 爆炸角度
  19. /// </summary>
  20. public float m_AttackAngle = 360;
  21. [SerializeField]
  22. private BaseYLPartAdon m_YL;//释放者挂件(言灵)
  23. [SerializeField]
  24. private BaseHero m_Hero;
  25. [SerializeField]
  26. private Transform m_BombEff;
  27. float m_FireTimeMax = 0.6f;//发射周期
  28. [SerializeField]
  29. private string m_CurUseSkill;
  30. float fireTime;
  31. bool isFire;
  32. //上次检测怪
  33. List<GameObject> LastMonsters = new List<GameObject>();
  34. List<GameObject> CurrentMonsters = new List<GameObject>();
  35. List<GameObject> CleanMonsters = new List<GameObject>();
  36. /// <summary>
  37. /// 初始化
  38. /// </summary>
  39. /// <param name="_YL">释放者挂件(言灵)</param>
  40. /// <param name="_hero">释放者(英雄)</param>
  41. /// <param name="_TargetPoint">目标点</param>
  42. /// <param name="_CurUseSkill">当前技能ID</param>
  43. public void init(BaseYLPartAdon _YL, BaseHero _hero, Transform _BombEff, string _CurUseSkill)
  44. {
  45. m_YL = _YL;
  46. m_Hero = _hero;
  47. m_BombEff = _BombEff;
  48. m_CurUseSkill = _CurUseSkill;
  49. }
  50. void Awake()
  51. {
  52. fireTime = m_FireTimeMax;
  53. }
  54. // Start is called before the first frame update
  55. void Start()
  56. {
  57. gameObject.GetComponentInChildren<FBXEventYL>().SetOwner(this.gameObject);//设置事件类拥有者
  58. }
  59. private void Update()
  60. {
  61. if (isFire)
  62. {
  63. //计时,周期发送伤害
  64. if (fireTime >= m_FireTimeMax)
  65. {
  66. fireTime = 0;
  67. ///检测范围内的怪
  68. CurrentMonsters = PlayerHelperAdon.GetNearMonsters(m_AttackSight, m_AttackAngle, gameObject);
  69. for (int i = 0; i < CurrentMonsters.Count; i++)
  70. {
  71. BaseMonsterAdon monster = CurrentMonsters[i].GetComponent<BaseMonsterAdon>();
  72. //X2Battle.X2BattleManager.Instance.mBulletModel.OnCastSkill(
  73. // m_Hero.mData.UID, m_CurUseSkill,
  74. // false, m_YL.M_YLType, monster.mData.UID, false);
  75. BulletMessage.catSkillFun(m_Hero.mData.UID, m_CurUseSkill,
  76. false, (int)m_YL.M_YLType, monster.mData.UID, false);
  77. //实例化克隆爆炸光效
  78. Transform effobj = Instantiate(m_BombEff);
  79. effobj.position = monster.m_HitObj.position;//设置爆炸位置
  80. effobj.gameObject.SetActive(true);
  81. //给星云旋涡内对敌人施加吸力
  82. Vector3 force = transform.position - monster.transform.position;//推力方向
  83. monster.m_RigidbodyTimeline3D.velocity = force * 2.5f;//吸力速度
  84. //敌人播放移动动作
  85. //敌人看向外围方向
  86. //暂停AI行为树
  87. monster.CurrentBehaviorTree.DisableBehavior(true);
  88. //计算吸力角度
  89. //比对之前的怪列表,清理之前的怪
  90. //for (int l = 0; l < LastMonsters.Count; i++)
  91. //{
  92. // //移除相同怪
  93. // if (monster == LastMonsters[l])
  94. // {
  95. // LastMonsters.RemoveAt(l);
  96. // break;
  97. // }
  98. //}
  99. }
  100. //比对之前的怪列表,清理之前的怪
  101. for (int i = 0; i < LastMonsters.Count; i++)
  102. {
  103. bool isCurren = true;
  104. GameObject temp = LastMonsters[i];
  105. for (int l = 0; l < CurrentMonsters.Count; l++)
  106. {
  107. if (temp == CurrentMonsters[i])
  108. {
  109. isCurren = false;
  110. }
  111. }
  112. if (isCurren)
  113. {
  114. CleanMonsters.Add(temp);//添加进清理列表
  115. //清理debuff,恢复正常
  116. BaseMonsterAdon monster = CleanMonsters[i].GetComponent<BaseMonsterAdon>();
  117. monster.CurrentBehaviorTree.EnableBehavior();
  118. }
  119. }
  120. //for (int i = 0; i < CleanMonsters.Count; i++)
  121. //{
  122. // //清理debuff,恢复正常
  123. // BaseMonsterAdon monster = CleanMonsters[i].GetComponent<BaseMonsterAdon>();
  124. // monster.CurrentBehaviorTree.EnableBehavior();
  125. //}
  126. }
  127. fireTime += Time.deltaTime;
  128. LastMonsters = CurrentMonsters;
  129. }
  130. }
  131. //public void SetHero(BaseHero _hero)
  132. //{
  133. // m_Hero = _hero;
  134. //}
  135. //public void SetBombEff(Transform _bombEff)
  136. //{
  137. // m_BombEff = _bombEff;
  138. //}
  139. ///// <summary>
  140. /// 攻击触发
  141. /// </summary>
  142. /// <param name="attackId">子连击id</param>
  143. public void OnAttackOn(string attackId)
  144. {
  145. isFire = true;
  146. }
  147. public void OnAttackOff()
  148. {
  149. isFire = false;
  150. //释放被吸对象AI行动
  151. for(int i = 0;i< CurrentMonsters.Count;i++)
  152. {
  153. BaseMonsterAdon monster = CurrentMonsters[i].GetComponent<BaseMonsterAdon>();
  154. monster.CurrentBehaviorTree.EnableBehavior();
  155. }
  156. }
  157. #if UNITY_EDITOR
  158. /// <summary>
  159. /// 绘制打击配置
  160. /// </summary>
  161. private void OnDrawGizmosSelected()
  162. {
  163. Vector3 forward = transform.forward;
  164. UnityEditor.Handles.color = new Color(1.0f, 0.0f, 0.0f, 0.1f);
  165. Vector3 rotatedForward = Quaternion.Euler(0, -m_AttackAngle * 0.5f, 0) * transform.forward;
  166. UnityEditor.Handles.DrawSolidArc(transform.position, Vector3.up, rotatedForward, m_AttackAngle, m_AttackSight);
  167. }
  168. #endif
  169. }
  170. }