using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using Cysharp.Threading.Tasks;
|
using DG.Tweening;
|
using UnityEngine;
|
|
public class BulletSkillEffect : SkillEffect
|
{
|
// protected SkillConfig skillConfig;
|
// protected BattleObject caster;
|
// protected List<BattleObject> targets; // 目标列表
|
|
protected List<BulletCurve> bulletCurves = new List<BulletCurve>();
|
|
public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
|
: base(_skillConfig, _caster, _tagUseSkillAttack)
|
{
|
|
}
|
|
|
public override void OnMiddleFrameStart(int times)
|
{
|
base.OnMiddleFrameStart(times);
|
// 弹射 另外的做法了
|
if (skillConfig.effectType == SkillEffectType.Bullet && skillConfig.BulletPath == 4)
|
{
|
var hurt = tagUseSkillAttack.HurtList[0];
|
BattleObject targetObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObject == null)
|
{
|
BattleDebug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
return;
|
}
|
ShotToTarget(targetObject);
|
}
|
// 普通的做法 区分打向阵营或者打向个体
|
else
|
{
|
Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHitFormation = (_hitIndex, _hurtList) =>
|
{
|
onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
|
};
|
switch (skillConfig.castMode)
|
{
|
case SkillCastMode.Self:
|
onHitFormation?.Invoke(0, tagUseSkillAttack.HurtList.ToList());
|
BattleDebug.LogError("子弹的目标是自己,暂时不支持 协商程序完成");
|
break;
|
case SkillCastMode.Enemy:
|
var targetNode = caster.battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
|
ShotToFormation(targetNode, onHitFormation);
|
break;
|
case SkillCastMode.Target:
|
for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
|
{
|
var hurt = tagUseSkillAttack.HurtList[i];
|
BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (target == null)
|
{
|
BattleDebug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
ShotToTarget(target);
|
}
|
break;
|
case SkillCastMode.Allies:
|
var healNode = caster.battleField.GetTeamNode(caster.Camp, skillConfig);
|
ShotToFormation(healNode, onHitFormation);
|
break;
|
default:
|
BattleDebug.LogError("暂时不支持其他的方式释放 有需求请联系程序 " + skillConfig.SkillID);
|
break;
|
}
|
}
|
}
|
|
protected void ShotToFormation(RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
|
{
|
BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
|
|
RectTransform effectTrans = effectPlayer.transform as RectTransform;
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, (index, hitList) =>
|
{
|
// 表现子弹飞行到目标位置
|
_onHit?.Invoke(index, hitList);
|
|
// 击中就销毁子弹
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
// 播放子弹爆炸特效
|
|
foreach (var hurt in hitList)
|
{
|
BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObj == null)
|
{
|
BattleDebug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
var effect1 = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
|
var effect2 = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
|
if (effect1 != null)
|
{
|
effect1.transform.localRotation = effectTrans.localRotation;
|
}
|
if (effect2 != null)
|
{
|
effect2.transform.localRotation = effectTrans.localRotation;
|
}
|
}
|
|
});
|
|
bulletCurves.Add(bulletCurve);
|
|
}
|
|
protected void ShotToTarget(BattleObject target)
|
{
|
BattleDebug.LogError("发射子弹 " + skillConfig.BulletEffectId);
|
BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
|
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, (index, hitList) =>
|
{
|
// 表现子弹飞行到目标位置
|
onHit?.Invoke(index, hitList);
|
|
|
BattleDebug.LogError("回收子弹 " + skillConfig.BulletEffectId);
|
// 播放子弹爆炸特效
|
|
|
foreach (var hurt in hitList)
|
{
|
BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObj == null)
|
{
|
BattleDebug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
if (skillConfig.ExplosionEffectId > 0)
|
{
|
var eft = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
|
eft.transform.localRotation = effectPlayer.transform.localRotation;
|
if (eft.transform.localScale.x < 0f)
|
{
|
eft.transform.localRotation *= Quaternion.Euler(0, 180, 0);
|
}
|
}
|
|
if (skillConfig.ExplosionEffect2 > 0)
|
{
|
var eft = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
|
eft.transform.localRotation = effectPlayer.transform.localRotation;
|
if (eft.transform.localScale.x < 0f)
|
{
|
eft.transform.localRotation *= Quaternion.Euler(0, 180, 0);
|
}
|
}
|
}
|
|
// 击中就销毁子弹
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
isFinish = true;
|
});
|
|
bulletCurves.Add(bulletCurve);
|
}
|
|
|
|
public override void Run()
|
{
|
foreach (var bulletCurve in bulletCurves)
|
{
|
if (!bulletCurve.IsFinished)
|
bulletCurve.Run();
|
}
|
}
|
|
public override bool IsFinished()
|
{
|
bool isCurveFinish = false;
|
|
foreach (var bulletCurve in bulletCurves)
|
{
|
isCurveFinish |= bulletCurve.IsFinished;
|
}
|
|
return isCurveFinish && isFinish;
|
}
|
}
|