using System; using Core.Audio; using Core.Triiger; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Hero; using UnityEngine; using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface; namespace Common.Combat.FxAILogic { [AddComponentMenu("特效脚本/弹道/直线飞行弹道")] public class FxAIBeelineBulletLogic : FxAILogicBasic { public float speed; private IUnRegister UnRegister = null; [Header("释放碰撞到地面时结束")] public bool isTriggerGroundEnd; [Header("碰撞到地面时的特效")] public string GroundHitFxName; private Vector3 endPos; private Vector3 dir; public float maxDis = 20; protected float maxDisSpr; protected override void ProInit() { maxDisSpr= maxDis* maxDis; UnRegister = gameObject.OnTriggerEnterEvent(this,OnTriggerEnterEvent); if (isUseCustomTargetEndPos) { endPos = TimeLineEventParticleLogicBasic.customizePos[ customTargetEndPosIndex]; } else { endPos = AttTarget.GetSpecialDotInfo("hitpos").GetWorlPos(); endPos = new Vector3(endPos.x, CurrPos.y, endPos.z); } dir = (endPos - CurrPos).normalized; gameObject.transform.rotation = Quaternion.LookRotation(dir); } void TriggerGround() { ITimeLineTriggerEvent timeLineTriggerEvent = TimeLineEventParticleLogicBasic.ITimeLineTriggerEntity as ITimeLineTriggerEvent; FinishHit(new Vector3(_currPos.x, 0.5f, _currPos.z), GroundHitFxName); AudioManager.Instance.PlayAudio(hitAudioName, false); if (timeLineTriggerEvent != null) { timeLineTriggerEvent.TimeLineTriggerGround( TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName, this, triggerData); } AudioManager.Instance.PlayAudio(hitAudioName, false); Dispose(); } protected void OnTriggerEnterEvent(Collider collision,ITriggerEntity triggerEntity) { ITimeLineTriggerEvent timeLineTriggerEvent = TimeLineEventParticleLogicBasic.ITimeLineTriggerEntity as ITimeLineTriggerEvent; if (isTriggerGroundEnd) { if (collision.gameObject.CompareTag("dimian")) { TriggerGround(); return; } } HeroEntityMono heroEntityMono = collision.gameObject.GetComponent(); if (heroEntityMono == null) { return; } CombatHeroEntity target = heroEntityMono.combatHeroEntity; if (target.IsEnemy == CombatHeroEntity.IsEnemy) { return; } if (timeLineTriggerEvent != null) { timeLineTriggerEvent.TimeLineTrigger(TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName, target.GetMainHotPoin(), this, triggerData); if (!string.IsNullOrEmpty(hitFxName)) { FinishHit(collision.ClosestPoint(gameObject.transform.position), hitFxName); } AudioManager.Instance.PlayAudio(hitAudioName, false); if (!isPenetrate) { Dispose(); } } } protected override void ProCombatUpdate(float time) { Vector3 lastPos = _currPos; Vector3 movePos = dir * speed * time; _currPos += movePos; gameObject.transform.position = _currPos; if (!isTriggerGroundEnd) { if (Vector3.SqrMagnitude(_currPos - startPos) >maxDisSpr) { Dispose(); } } else { if (_currPos.y < 0.3f) { TriggerGround(); } } } protected override void ProDispose() { if (UnRegister != null) { UnRegister.UnRegister(); } UnRegister = null; } } }