/// <summary> /// 处理命中时的伤害变化 /// </summary> private void ProcessDirectDamage() { Assert.Should(m_tempTargeters != null); // 直接伤害:直线 if (BulletTypeUtil.IsLine(Entity.model.bulletType)) { foreach (var tar in m_tempTargeters) { var pos = tar.GetCurrentPosition(); var targeters = FindTargetersLine(pos.x, pos.y, 0.8f); // REMARK:这里直线宽度暂时设置为0.8个格子大小(可以适当调整) GameDamageManager.ProcessDamageMultiTargeters(targeters, Entity.model, Entity); } } // 直接伤害:扇形(包括360度环形) else if (Entity.model.attackAngle > 0) { foreach (var tar in m_tempTargeters) { var pos = tar.GetCurrentPosition(); var targeters = FindTargetersInAngle(pos.x, pos.y, Entity.model.attackAngle); GameDamageManager.ProcessDamageMultiTargeters(targeters, Entity.model, Entity); } } // 直接伤害:其他形状 else { GameDamageManager.ProcessDamageMultiTargeters(m_tempTargeters, Entity.model, Entity); } }
/// <summary> /// 根据AttackPoint处理发射字段或直接伤害 /// </summary> /// <param name="obj"></param> private void view_OnFireBullet(List <Vector3> obj) { // 全跪了则不处理了o.o if (AuxIsAllDead()) { return; } var bt = Entity.model.bulletType; // 在AttackPoint点造成直接伤害 if (BulletTypeUtil.IsDirectDamage(bt)) { // 处理非循环子弹效果 if (BulletTypeUtil.IsUnLoopEffect(bt)) { Assert.Should(Entity.model.bulletName != null && Entity.model.bulletName != Constants.EMPTY); // 连接类型效果数量是 挂载点数 * 目标数 var effIdList = new List <int>(); for (int i = 0; i < obj.Count * m_tempTargeters.Count; i++) { effIdList.Add(GameEffectManager.Instance.AddEffect(Entity.model.bulletName, Vector3.zero, false)); } // 初始化效果相关属性 InitBulletEffectAttribute(bt, obj, effIdList, m_tempTargeters.RubyMap(tar => tar.GetCurrentPositionCenter())); } ProcessDirectDamage(); } // 在AttackPoint处发射子弹 else if (BulletTypeUtil.IsFireBullet(bt)) { foreach (var firepos in obj) { ProcessFireBullet(new Vector2(firepos.x, firepos.z)); } } else { Assert.Should(false, "invalid bullet type...: " + bt); } }
/// <summary> /// 处理子弹 - 循环效果类的子弹 /// </summary> private void ProcessBullet_LoopEffect() { // 不是循环效果类型子弹直接返回 if (!BulletTypeUtil.IsLoopEffect(Entity.model.bulletType)) { return; } // 没对应的挂载点则返回 var effAttackPoint = Entity.effAttachPoint(); if (effAttackPoint == null) { return; } Assert.Should(Entity.model.bulletName != null && Entity.model.bulletName != Constants.EMPTY); // 添加循环子弹效果 var effectName = Entity.model.bulletName; // 计算需要的效果数量 var needEffectCount = 0; switch (Entity.model.bulletType) { case EntityBulletType.LoopEffectLock: needEffectCount = effAttackPoint.Count; // 朝阳目标的(类似火焰等)需要的数量和挂载点数一致) break; case EntityBulletType.LoopEffectLink: needEffectCount = effAttackPoint.Count * m_tempTargeters.Count; // REMARK:连接目标的(需要的熟练是挂在点数和目标数的乘机) break; default: break; } // 初始化N个效果 if (m_bulletLoopEffectIdList == null) { m_bulletLoopEffectIdList = new List <int>(); for (int i = 0; i < needEffectCount; i++) { m_bulletLoopEffectIdList.Add(GameEffectManager.Instance.AddEffect(effectName, Vector3.zero, true)); } } // 释放多余的效果 else if (m_bulletLoopEffectIdList.Count > needEffectCount) { do { int effId = m_bulletLoopEffectIdList[0]; m_bulletLoopEffectIdList.RemoveAt(0); GameEffectManager.Instance.RemoveEffect(effId); } while (m_bulletLoopEffectIdList.Count > needEffectCount); } // 补齐不足的数量 else { int num = needEffectCount - m_bulletLoopEffectIdList.Count; for (int i = 0; i < num; i++) { m_bulletLoopEffectIdList.Add(GameEffectManager.Instance.AddEffect(effectName, Vector3.zero, true)); } } // 初始化效果相关属性 InitBulletEffectAttribute(Entity.model.bulletType, effAttackPoint, m_bulletLoopEffectIdList, m_tempTargeters.RubyMap(tar => tar.GetCurrentPositionCenter())); }