using System; using UnityEngine; namespace Game { public class SkillHitInfo { public AttackBehaviour SkillParam; public float AttackRate; public float StunkRate; public int OwnerEntity; public int HitEntity; //0为非实体对象 public Vector3 HitDir; public bool IsDealed; //已经结算 public string SkillId; //是否技能造成的伤害 public uint Performance; //性能tag的mask public int StaggerLevel; public bool IsBreak; public EHitType HitType; } public class ClipAttack : TimelineClipBase { private AttackClip _mRealAsset; public override void OnEnter() { _mRealAsset = Asset as AttackClip; } public override void OnStay() { var param = _mRealAsset.template; var skill = Owner.skill; var castShape = param.Shape; var castDir = Owner.skill.CastDir; castDir = new Vector3(castDir.x, 0, castDir.z); //忽略y var rot = Quaternion.FromToRotation(Vector3.right, castDir); var castPos = rot * castShape.Offset + Owner.Pos(); Util.DrawShape(castShape, castPos, castDir, Color.red); Util.ForeachEnemies(Owner.Team(), target => { var isHit = UtilShape.IsOverlap(castShape, castPos, castDir, target.hp.HitBoxShape, target.Pos()); if (isHit) { var targetID = target.ID(); var hitKey = new Tuple(targetID, param.hitId); if (Owner.skill.SkillHitInfo.ContainsKey(hitKey)) return; var skillHitInfo = new SkillHitInfo { SkillParam = param, AttackRate = 1, StunkRate = 1, OwnerEntity = Owner.ID(), HitEntity = targetID, HitDir = castDir, IsDealed = false, SkillId = skill.SkillId.Value, Performance = 0, StaggerLevel = param.staggerLevel, IsBreak = true, HitType = param.hitType, }; if (!string.IsNullOrEmpty(skillHitInfo.SkillId)) { var skillCfg = Util.GetSkillMasterConfigData(skillHitInfo.SkillId); if (skillCfg != null) { var featureSkill = skillCfg.GetFeatureSkill(); skillHitInfo.AttackRate = featureSkill.AttackRate; skillHitInfo.StunkRate = featureSkill.StunRate; } } Owner.skill.SkillHitInfo[hitKey] = skillHitInfo; } }); } public override void OnLeave() { } } }