using Adon.Game.BO; using Adon.Game.Helper; using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace AdonGameKit { /// /// 言灵 抛物线子弹 /// public class YLParabolicBulletAdon : MonoBehaviour { /// /// 子弹步进速度 /// public float velocity = 30; /// /// 推进倍增值 /// public float RaycastAdvance = 2f; /// /// 射线碰撞层 /// public int curLayerMask = 0; /// /// 生命周期 /// public float lifeTime = 5f; /// /// 是否延迟销毁 /// public bool DelayDespawn = false; /// /// 粒子消退延迟时间 /// public float despawnDelay = 0; public BaseYLPartAdon m_YL;//释放者挂件(言灵) public BaseHero m_Hero;//释放者(英雄) public string m_CurUseSkill; public Transform m_HitEff; /// /// 抛物完成回掉 /// public Action m_OnComplete; bool isHit = false; bool isFXSpawned = false; // 碰撞光效只生产一次 RaycastHit hitPoint; //碰撞点 float timer = 0f; // 子弹生命周期计时 ParticleSystem[] particles;//子弹粒子系统数组 Sequence seq; Vector3 m_targetPot; void Awake() { curLayerMask = LayerMask.NameToLayer("Enemy"); particles = GetComponentsInChildren(); seq = DOTween.Sequence(); } // Start is called before the first frame update void Start() { } void FixedUpdate() { if (isHit)//如果有碰撞 { if (!isFXSpawned)//执行一次 { isFXSpawned = true; BaseMonsterAdon component = hitPoint.transform.GetComponent(); if (component != null) { //实例化克隆爆炸光效 Transform effobj = Instantiate(m_HitEff); if (!effobj.GetComponent()) effobj.gameObject.AddComponent();//添加延迟销毁脚本 effobj.position = new Vector3(hitPoint.point.x, component.transform.position.y, hitPoint.point.z);//设置爆炸位置 effobj.gameObject.SetActive(true); if (m_OnComplete != null) m_OnComplete(effobj.gameObject);//抛物线完成回调 //发送伤害消息 //X2Battle.X2BattleManager.Instance.mBulletModel.OnCastSkill( // m_Hero.mData.UID, m_CurUseSkill, // false, m_YL.M_YLType, component.mData.UID, false); BulletMessage.catSkillFun(m_Hero.mData.UID, m_CurUseSkill, false, (int)m_YL.M_YLType, component.mData.UID, false); } } // 不延迟则销毁 if (!DelayDespawn || (DelayDespawn && (timer >= despawnDelay))) OnProjectileDestroy();//销毁 } else { Vector3 step = transform.forward * Time.deltaTime * velocity;//子弹步进 // 如果射线碰撞 if (Physics.Raycast(transform.position, transform.forward, out hitPoint, step.magnitude * RaycastAdvance, 1 << curLayerMask)) { isHit = true;//碰撞 if (DelayDespawn)//粒子延迟淡出再销毁 { timer = 0f; Delay();//碰撞后粒子延迟消逝 } } else { // 生命周期到了则销毁 if (timer >= lifeTime) OnProjectileDestroy(); } } // Updates projectile timer timer += Time.deltaTime; } /// /// 子弹销毁 /// void OnProjectileDestroy() { //销毁,后期改为对象池 Destroy(this.gameObject); } /// /// 停止粒子释放并逐渐消逝 /// void Delay() { if (particles.Length > 0) { for (int i = 0; i < particles.Length; i++) { particles[i].Stop(false); } } } public void ParabolicDoTween(Vector3 targetPot) { m_targetPot = targetPot; var ParabolicDis = Vector3.Distance(targetPot, this.transform.position); var ParabolicDown = targetPot.y; var speed = 5.0f; var time = ParabolicDis / speed; seq.Append(this.transform.DOMove(targetPot, time).SetEase(Ease.Linear)); //seq.Append(this.transform.DOMoveZ(targetPot.z, time / 2).SetEase(Ease.Unset)); seq.Insert(0, this.transform.DOMoveY(targetPot.y + 3, time * 0.5f).SetEase(Ease.OutCirc)); seq.Insert(time * 0.5f, this.transform.DOMoveY(ParabolicDown, time * 0.5f).SetEase(Ease.InCirc)); seq.OnComplete(() => { OnDoTweenComplete(); }); } public void OnDoTweenComplete() { Debug.Log("抛物线完成!"); //实例化克隆爆炸光效 Transform effobj = Instantiate(m_HitEff); if (!effobj.GetComponent()) effobj.gameObject.AddComponent();//添加延迟销毁脚本 effobj.position = m_targetPot;//设置爆炸位置 effobj.gameObject.SetActive(true); if (m_OnComplete != null) m_OnComplete(effobj.gameObject); Destroy(this.gameObject); } } }