using System.Collections.Generic; 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 FxParabolaBulletLogic : 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; // private BesselPath _besselPath; private float _addTime; protected Vector3 startDir; private float dirLerpTime; protected override void ProInit() { maxDisSpr = maxDis * maxDis; UnRegister = gameObject.OnTriggerEnterEvent(OnTriggerEnterEvent); if (isUseCustomTargetEndPos) { endPos = TimeLineEventParticleLogicBasic.customizePos[ customTargetEndPosIndex]; } else { endPos = AttTarget.GetSpecialDotInfo("hitpos").GetWorlPos(); // endPos = new Vector3(endPos.x, CurrPos.y, endPos.z); } startDir = CombatHeroEntity.GameObject.transform.TransformPoint(new Vector3(Mathf.Sign(Random.Range(-1, 1)), Random.Range(0.1F, 1), 1)); startDir =( startDir-_currPos).normalized; dirLerpTime = 0; // 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 GetTargetPos() { if (isUseCustomTargetEndPos) { endPos = TimeLineEventParticleLogicBasic.customizePos[ customTargetEndPosIndex]; } else { endPos = AttTarget.GetSpecialDotInfo("hitpos").GetWorlPos(); // endPos = new Vector3(endPos.x, CurrPos.y, endPos.z); } } protected void OnTriggerEnterEvent(Collider collision) { 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(); } } } private void FinishHit(Vector3 pos, string hitFxName) { if (!string.IsNullOrEmpty(hitFxName)) { CombatController.currActiveCombat.GameTimeLineParticleFactory.CreateParticle(hitFxName, pos, null, false, null, null); } } protected override void ProCombatUpdate(float time) { currTime += _addTime * time; dirLerpTime += time*1.2F; if (dirLerpTime > 1) { dirLerpTime = 1; } GetTargetPos(); Vector3 dir = (endPos - _currPos).normalized; dir = Vector3.Lerp(startDir, dir, dirLerpTime).normalized; Vector3 lasetPos = _currPos; _currPos += dir * speed * time; gameObject.transform.position = _currPos; gameObject.transform.rotation = Quaternion.LookRotation(dir); if (Vector3.Distance(endPos, _currPos) < 0.5f) { Dispose(); } // if (currTime >= 1) // { // Dispose(); // } // 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; } } }