125 战斗 诸葛果 连续普攻问题修复 治疗技能增加
New file |
| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using System; |
| | | |
| | | public class RendererAdjuster : MonoBehaviour |
| | | { |
| | | public int renderQueue = 3000; |
| | | |
| | | public Canvas canvas; |
| | | |
| | | public int sortingOrderOffset = 1; |
| | | |
| | | public string customSortingLayer = "UI"; |
| | | |
| | | public List<Renderer> renderers = new List<Renderer>(); |
| | | |
| | | public void Awake() |
| | | { |
| | | UpdateComps(); |
| | | } |
| | | |
| | | protected void UpdateComps() |
| | | { |
| | | renderers.Clear(); |
| | | renderers.AddRange(gameObject.GetComponentsInChildren<Renderer>(true)); |
| | | |
| | | canvas = GetComponentInParent<Canvas>(); |
| | | } |
| | | |
| | | public void SetParentCanvas(Canvas _canvas) |
| | | { |
| | | canvas = _canvas; |
| | | this.DelayFrame(UpdateSortingOrder); |
| | | } |
| | | |
| | | public void UpdateSortingOrder() |
| | | { |
| | | int canvasSortingOrder = 0; |
| | | |
| | | // 获取父级Canvas的排序顺序 |
| | | if (canvas != null) |
| | | { |
| | | canvasSortingOrder = canvas.sortingOrder; |
| | | } |
| | | else |
| | | { |
| | | // 如果没有找到父级Canvas,则使用默认值 |
| | | canvasSortingOrder = 0; |
| | | } |
| | | |
| | | // 将特效的排序顺序设置为Canvas排序顺序加上偏移量 |
| | | ApplySortingSettings(canvasSortingOrder + sortingOrderOffset, customSortingLayer); |
| | | } |
| | | |
| | | private void ApplySortingSettings(int sortingOrder, string sortingLayer) |
| | | { |
| | | foreach (Renderer renderer in renderers) |
| | | { |
| | | if (renderer != null) |
| | | { |
| | | renderer.sortingOrder = sortingOrder; |
| | | renderer.material.renderQueue = renderQueue; // 设置渲染队列 |
| | | // renderer.material.renderQueue = overlayRQ; |
| | | if (!string.IsNullOrEmpty(sortingLayer)) |
| | | { |
| | | renderer.sortingLayerName = sortingLayer; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | fileFormatVersion: 2 |
| | | guid: 75517d945fb16024d9ab09ca21288a01 |
| | | MonoImporter: |
| | | externalObjects: {} |
| | | serializedVersion: 2 |
| | | defaultReferences: [] |
| | | executionOrder: 0 |
| | | icon: {instanceID: 0} |
| | | userData: |
| | | assetBundleName: |
| | | assetBundleVariant: |
| | |
| | | blocker.SetParentCanvas(canvas); |
| | | } |
| | | } |
| | | |
| | | RendererAdjuster[] adjusters = battleRootNode.GetComponentsInChildren<RendererAdjuster>(true); |
| | | if (null != adjusters) |
| | | { |
| | | foreach (var adjuster in adjusters) |
| | | { |
| | | adjuster.SetParentCanvas(canvas); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public void StartBattle(Action onMoveComplete) |
| | |
| | | Camp = _camp; |
| | | motionBase = new MotionBase(); |
| | | motionBase.Init(heroGo.GetComponentInChildren<SkeletonGraphic>(true)); |
| | | motionBase.onAnimationComplete += OnAnimationComplete; |
| | | buffMgr = new BattleObjectBuffMgr(); |
| | | buffMgr.Init(this); |
| | | |
| | |
| | | |
| | | public virtual void Destroy() |
| | | { |
| | | motionBase.onAnimationComplete -= OnAnimationComplete; |
| | | |
| | | motionBase.Release(); |
| | | motionBase = null; |
| | |
| | | OnDeadAnimationComplete(); |
| | | _onDeathAnimationComplete?.Invoke(); |
| | | }); |
| | | } |
| | | |
| | | // 不一定可靠 有时候会插入其他动作就完了 |
| | | protected virtual void OnAnimationComplete(string motionName) |
| | | { |
| | | |
| | | } |
| | | |
| | | protected virtual void OnDeadAnimationComplete() |
| | |
| | | |
| | | // 而AttackType一般代表的是本次技能的伤害飘血类型,如普通伤害,暴击伤害、格挡、回血等 |
| | | |
| | | // 伤血类型: 1-普通;2-回血;3-反弹;4-流血;5-格挡;7-暴击,9-闪避 |
| | | |
| | | // |
| | | // 101011111 |
| | |
| | | { |
| | | Damage = 2, |
| | | Recovery = 4, |
| | | Reflect = 8, |
| | | Bloody = 16, |
| | | Block = 32, |
| | | Crit = 128, |
| | | Dodge = 512 |
| | |
| | | // 动画事件 |
| | | public Action OnAttackAnimationComplete; |
| | | public Action OnHitAnimationComplete; |
| | | public Action<string> onAnimationComplete; |
| | | |
| | | private List<Action> runActionList = new List<Action>(); |
| | | |
| | |
| | | OnHitAnimationComplete?.Invoke(); |
| | | PlayAnimation(MotionName.idle, true); |
| | | } |
| | | |
| | | onAnimationComplete?.Invoke(animation); |
| | | |
| | | // 只调用本次TrackEntry的回调 |
| | | if (trackEntryCompleteDict.TryGetValue(trackEntry, out var cb)) |
| | |
| | | |
| | | public void PlayRecord(RecordAction recordAction) |
| | | { |
| | | BattleDebug.LogError("Enqueue record action " + recordAction.GetType()); |
| | | // BattleDebug.LogError("Enqueue record action " + recordAction.GetType()); |
| | | recordActionQueue.Enqueue(recordAction); |
| | | } |
| | | |
| | |
| | | |
| | | public void InsertRecord(RecordAction recordAction) |
| | | { |
| | | BattleDebug.LogError("Insert record action " + recordAction.GetType()); |
| | | // BattleDebug.LogError("Insert record action " + recordAction.GetType()); |
| | | if (currentRecordAction != null) |
| | | { |
| | | Queue<RecordAction> tempQueue = new Queue<RecordAction>(); |
| | |
| | | |
| | | if (currentRecordAction != null && currentRecordAction.IsFinished()) |
| | | { |
| | | BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished"); |
| | | // BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished"); |
| | | currentRecordAction = null; |
| | | isWaitingNextAction = true; |
| | | waitTimer = 0f; |
| | |
| | | if (recordActionQueue.Count > 0) |
| | | { |
| | | currentRecordAction = recordActionQueue.Dequeue(); |
| | | BattleDebug.LogError("play record action " + currentRecordAction.GetType()); |
| | | // BattleDebug.LogError("play record action " + currentRecordAction.GetType()); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | public class DirectlyHealSkill : SkillBase |
| | | { |
| | | protected SkillEffect skillEffect; |
| | | |
| | | public DirectlyHealSkill(BattleObject _caster, SkillConfig _skillCfg, |
| | | HB427_tagSCUseSkill _vNetData, List<GameNetPackBasic> _packList, BattleField _battleField) |
| | |
| | | } |
| | | |
| | | |
| | | // // 前摇结束 |
| | | // public override void OnStartSkillFrameEnd() |
| | | // { |
| | | // skillEffect = SkillEffectFactory.CreateSkillEffect( |
| | | // caster, |
| | | // skillConfig, |
| | | // tagUseSkillAttack |
| | | // ); |
| | | // if (skillEffect != null) |
| | | // { |
| | | // skillEffect.Play(OnHitTargets); |
| | | // } |
| | | // } |
| | | protected override void OnHitTargets(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList) |
| | | { |
| | | base.OnHitTargets(_hitIndex, hitList); |
| | | } |
| | | |
| | | // protected override void OnHitTargets(int _healIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> healList) |
| | | // { |
| | | // base.OnHitTargets(_healIndex, healList); |
| | | // } |
| | | protected override void OnAllAttackMoveFinished() |
| | | { |
| | | base.OnAllAttackMoveFinished(); |
| | | |
| | | OnSkillFinished(); |
| | | } |
| | | |
| | | } |
| | |
| | | HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack)); |
| | | highlightList.Add(caster); |
| | | |
| | | |
| | | // caster.battleField.skillMask |
| | | // 把这些BO全高亮 或者说把除了这些的都放在遮罩后面 |
| | | // YYL TODO |
| | | } |
| | |
| | | // 先实现一个攻击的 后续有再慢慢增加 |
| | | skill = new DirectlyDamageSkill(_caster, skillConfig, vNetData, packList, battleField); |
| | | break; |
| | | // case 2: |
| | | // // skill = new DirectlyHealSkill(_skillConfig); |
| | | // break; |
| | | case 2: |
| | | skill = new DirectlyHealSkill(_caster, skillConfig, vNetData, packList, battleField); |
| | | break; |
| | | // case 3: |
| | | // case 4: |
| | | // case 5: |
| | |
| | | private Vector2 control; |
| | | |
| | | public BezierBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, |
| | | RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, onHit) { } |
| | | RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, bulletIndex, onHit) { } |
| | | |
| | | public override void Reset() |
| | | { |
| | |
| | | if (t >= 1f) |
| | | { |
| | | finished = true; |
| | | onHit?.Invoke(0, hurts); |
| | | onHit?.Invoke(mBulletIndex, hurts); |
| | | } |
| | | } |
| | | } |
| | |
| | | private float bounceElapsed = 0f; |
| | | |
| | | public BounceBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, |
| | | RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, onHit) |
| | | RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, bulletIndex, onHit) |
| | | { |
| | | this.hurtList = new List<HB427_tagSCUseSkill.tagSCUseSkillHurt>(tagUseSkillAttack.HurtList); |
| | | } |
| | |
| | | if (t >= 1f) |
| | | { |
| | | // 命中当前目标 |
| | | onHit?.Invoke(curIndex, hurtList); |
| | | onHit?.Invoke(mBulletIndex, hurtList); |
| | | |
| | | curIndex++; |
| | | if (curIndex >= hurtList.Count) |
| | |
| | | protected float duration = 0f; |
| | | protected float elapsed = 0f; |
| | | |
| | | protected int mBulletIndex; |
| | | |
| | | protected List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hurts = new List<HB427_tagSCUseSkill.tagSCUseSkillHurt>(); |
| | | |
| | | public BulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | public BulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, |
| | | HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | { |
| | | this.caster = caster; |
| | | this.skillConfig = skillConfig; |
| | |
| | | this.onHit = onHit; |
| | | this.bulletTrans = bulletEffect.transform as RectTransform; |
| | | this.hurts = tagUseSkillAttack.HurtList.ToList(); |
| | | this.mBulletIndex = bulletIndex; |
| | | |
| | | // 设置bulletTrans坐标为caster.heroRectTrans的世界坐标转换到bulletTrans父节点下的本地坐标 |
| | | if (bulletTrans != null && caster.heroRectTrans != null) |
| | |
| | | protected virtual void ReachTarget() |
| | | { |
| | | finished = true; |
| | | onHit?.Invoke(0, hurts); |
| | | onHit?.Invoke(mBulletIndex, hurts); |
| | | caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, bulletEffect); |
| | | } |
| | | |
| | |
| | | BattleEffectPlayer bulletEffect, |
| | | RectTransform target, |
| | | HB427_tagSCUseSkill tagUseSkillAttack, |
| | | int bulletIndex, |
| | | Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | { |
| | | BulletCurve curve = null; |
| | | switch (skillConfig.BulletPath) |
| | | { |
| | | case 1: // 直线消失于目标 |
| | | curve = new StraightBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit); |
| | | curve = new StraightBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit); |
| | | break; |
| | | case 2: // 直线贯穿消失在屏幕外 |
| | | curve = new PenetrateBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit); |
| | | curve = new PenetrateBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit); |
| | | break; |
| | | case 3: // 抛物线弧线 |
| | | curve = new BezierBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit); |
| | | curve = new BezierBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit); |
| | | break; |
| | | case 4: // 弹射 |
| | | curve = new BounceBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit); |
| | | curve = new BounceBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit); |
| | | break; |
| | | default: |
| | | curve = new BulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit); |
| | | curve = new BulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit); |
| | | break; |
| | | } |
| | | |
| | |
| | | private Vector2 outPos; // 屏幕外延长点(本地坐标) |
| | | private bool hitTriggered = false; // 是否已触发onHit |
| | | |
| | | public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, onHit) { } |
| | | public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer effectPlayer, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, bulletIndex, onHit) { } |
| | | |
| | | /// <summary> |
| | | /// 初始化弹道参数 |
| | |
| | | if (!hitTriggered) |
| | | { |
| | | hitTriggered = true; |
| | | onHit?.Invoke(0, hurts); |
| | | onHit?.Invoke(mBulletIndex, hurts); |
| | | } |
| | | } |
| | | bulletTrans.anchoredPosition = pos; |
| | |
| | | private Vector2 start; |
| | | private Vector2 end; |
| | | |
| | | public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, onHit) |
| | | { |
| | | public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, BattleEffectPlayer bulletEffect, RectTransform target, HB427_tagSCUseSkill tagUseSkillAttack, int bulletIndex, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHit) |
| | | : base(caster, skillConfig, bulletEffect, target, tagUseSkillAttack, bulletIndex, onHit) |
| | | { |
| | | |
| | | } |
| | | |
| | |
| | | if (t >= 1f) |
| | | { |
| | | finished = true; |
| | | onHit?.Invoke(0, hurts); |
| | | onHit?.Invoke(mBulletIndex, hurts); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | protected List<BulletCurve> bulletCurves = new List<BulletCurve>(); |
| | | |
| | | |
| | | public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack) |
| | | : base(_skillConfig, _caster, _tagUseSkillAttack) |
| | | { |
| | |
| | | Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID); |
| | | return; |
| | | } |
| | | ShotToTarget(targetObject); |
| | | ShotToTarget(targetObject, index); |
| | | } |
| | | // 普通的做法 区分打向阵营或者打向个体 |
| | | else |
| | |
| | | if (skillConfig.Scattering == 1) |
| | | { |
| | | // 散射 |
| | | ShotEachTargets(); |
| | | ShotEachTargets(index); |
| | | } |
| | | else |
| | | { |
| | | switch (skillConfig.TagAim) |
| | | { |
| | | case 0: |
| | | AllAreaShoting(); |
| | | AllAreaShoting(index); |
| | | break; |
| | | case 1: |
| | | OneTargetShoting(); |
| | | OneTargetShoting(index); |
| | | break; |
| | | case 2: |
| | | FrontRowShoting(); |
| | | FrontRowShoting(index); |
| | | break; |
| | | case 3: |
| | | BackRowShoting(); |
| | | BackRowShoting(index); |
| | | break; |
| | | case 4: |
| | | VerticalRowShoting(); |
| | | VerticalRowShoting(index); |
| | | break; |
| | | case 5: |
| | | SelfShoting(); |
| | | SelfShoting(index); |
| | | break; |
| | | default: |
| | | Debug.LogError("子弹特效没有配置正确的TagAim,强制结束子弹特效 TagAim: " + skillConfig.TagAim); |
| | |
| | | } |
| | | |
| | | // 0 全部范围: |
| | | private void AllAreaShoting() |
| | | private void AllAreaShoting(int index) |
| | | { |
| | | if (skillConfig.TagCount == 0 || skillConfig.TagCount >= 6) |
| | | { |
| | | // 若TagCount目标个数为0或6,根据TagFriendly敌我配置,代表作用于敌方全体或我方全体,此时主目标为敌我站位中的2号位置 |
| | | BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp(); |
| | | ShotToIndex(battleCamp, 1); |
| | | ShotToIndex(battleCamp, 1, index); |
| | | } |
| | | else |
| | | { |
| | | // 若TagCount目标个数为1~5个,代表随机作用于敌方或我方x个武将,此时所有被随机到的对象都为主目标(施法位置会用客户端配置) |
| | | ShotEachTargets(); |
| | | ShotEachTargets(index); |
| | | } |
| | | } |
| | | |
| | | // 1 对位: |
| | | private void OneTargetShoting() |
| | | private void OneTargetShoting(int index) |
| | | { |
| | | // 默认只选1个,对位规则为A1优先打B1,A2优先打B2,A3优先打B3,对位目标死亡时,优先前排, |
| | | // 比如B2已经死亡,那么A2将优先打B1,前排1、2、3号位置全部死亡之后才开始选择后排4、5、6号位置, |
| | |
| | | Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID); |
| | | return; |
| | | } |
| | | ShotToTarget(targetObject); |
| | | ShotToTarget(targetObject, index); |
| | | } |
| | | |
| | | // 2 前排: |
| | | private void FrontRowShoting() |
| | | private void FrontRowShoting(int index) |
| | | { |
| | | // 1、2、3号位为前排,默认2号位置为主目标,当1、2、3号位置角色全部死亡,前排将替换成后排,5号位置变更为主目标, |
| | | // 若配置TagAffect细分目标,且人数小于3,则所有被选择目标均为主目标(施法位置会用客户端配置) |
| | |
| | | |
| | | if (skillConfig.TagAffect != 0 && skillConfig.TagAffect != 3 && skillConfig.TagCount < 3) |
| | | { |
| | | ShotEachTargets(); |
| | | ShotEachTargets(index); |
| | | } |
| | | else |
| | | { |
| | |
| | | targetIndex = 1; |
| | | } |
| | | |
| | | ShotToIndex(battleCamp, targetIndex); |
| | | ShotToIndex(battleCamp, targetIndex, index); |
| | | } |
| | | |
| | | } |
| | | |
| | | private void ShotToIndex(BattleCamp camp, int targetIndex) |
| | | private void ShotToIndex(BattleCamp camp, int targetIndex, int bulletIndex) |
| | | { |
| | | RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex); |
| | | 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, targetTransform, tagUseSkillAttack, (index, hitList) => |
| | | var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack, bulletIndex, (index, hitList) => |
| | | { |
| | | if (isFinish) |
| | | return; |
| | |
| | | } |
| | | |
| | | // 3 后排: |
| | | private void BackRowShoting() |
| | | private void BackRowShoting(int index) |
| | | { |
| | | // 4、5、6号位为后排,默认5号位置为主目标,当4、5、6号位置角色全部死亡,后排排将替换成前排,2号位置变更为主目标, |
| | | // 若配置TagAffect细分目标,且人数小于3,则所有被选择目标均为主目标(施法位置会用客户端配置) |
| | |
| | | |
| | | if (skillConfig.TagAffect != 0 && skillConfig.TagAffect != 3 && skillConfig.TagCount < 3) |
| | | { |
| | | ShotEachTargets(); |
| | | ShotEachTargets(index); |
| | | } |
| | | else |
| | | { |
| | |
| | | targetIndex = 4; |
| | | } |
| | | |
| | | ShotToIndex(battleCamp, targetIndex); |
| | | ShotToIndex(battleCamp, targetIndex, index); |
| | | } |
| | | } |
| | | |
| | | // 4 纵排: |
| | | private void VerticalRowShoting() |
| | | private void VerticalRowShoting(int index) |
| | | { |
| | | // 纵排分别为1、4,2、5,3、6,三组纵排,按对位规则选择,默认1号、2号或3号为主目标,前排1、2、3号位置全部死完后,4号、5号或6号为主目标 |
| | | BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp(); |
| | |
| | | |
| | | if (minimumIndex != int.MaxValue) |
| | | { |
| | | ShotToIndex(battleCamp, minimumIndex); |
| | | ShotToIndex(battleCamp, minimumIndex, index); |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | |
| | | // 5 自己: |
| | | private void SelfShoting() |
| | | private void SelfShoting(int index) |
| | | { |
| | | // 默认只选自己,自己为主目标 |
| | | ShotToIndex(caster.Camp, caster.teamHero.positionNum); |
| | | ShotToIndex(caster.Camp, caster.teamHero.positionNum, index); |
| | | } |
| | | |
| | | protected void ShotToTarget(BattleObject target) |
| | | protected void ShotToTarget(BattleObject target, int bulletIndex) |
| | | { |
| | | 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) => |
| | | var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, bulletIndex, (index, hitList) => |
| | | { |
| | | if (isFinish) |
| | | return; |
| | |
| | | onHit?.Invoke(index, hitList); |
| | | // 击中就销毁子弹 |
| | | caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer); |
| | | |
| | | // 播放子弹爆炸特效 |
| | | isFinish = true; |
| | | |
| | | if (bulletIndex >= skillConfig.ActiveFrames.Length - 1) |
| | | { |
| | | isFinish = true; |
| | | } |
| | | }); |
| | | |
| | | bulletCurves.Add(bulletCurve); |
| | |
| | | } |
| | | } |
| | | |
| | | private void ShotEachTargets() |
| | | private void ShotEachTargets(int index) |
| | | { |
| | | for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++) |
| | | { |
| | |
| | | Debug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID); |
| | | continue; |
| | | } |
| | | ShotToTarget(target); |
| | | ShotToTarget(target, index); |
| | | } |
| | | } |
| | | |
| | |
| | | sliderHp.value = ((float)toHp) / ((float)maxHp); |
| | | } |
| | | |
| | | BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp); |
| | | // BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp); |
| | | } |
| | | |
| | | public void UpdateXP(long fromXp, long toXp, long maxXp, bool tween = true) |
| | |
| | | sliderXp.value = ((float)toXp) / ((float)maxXp); |
| | | } |
| | | |
| | | BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp); |
| | | // BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp); |
| | | } |
| | | |
| | | public void Run() |