You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			123 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			123 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | using System; | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace Game | ||
|  | { | ||
|  |     public class SkillHitInfo | ||
|  |     { | ||
|  |         public AttackBehaviour SkillParam; | ||
|  |         public float AttackRate; | ||
|  |         public float StunkRate; | ||
|  |         public float ExecutekRate; | ||
|  |         public int OwnerEntity; | ||
|  |         public int HitEntity;//0为非实体对象 | ||
|  |         public Vector3 HitPos; | ||
|  |         public Vector3 HitDir; | ||
|  |         public bool IsRight; | ||
|  |         public bool IsDealed;//已经结算 | ||
|  |         public string SkillId; //是否技能造成的伤害 | ||
|  |         public uint Performance;//性能tag的mask | ||
|  |         public int StaggerLevel; | ||
|  |         public bool IsBreak; | ||
|  |     } | ||
|  |     public class ClipAttack : TimelineClipBase | ||
|  |     { | ||
|  |         private AttackClip _mRealAsset; | ||
|  |         public override void OnEnter() | ||
|  |         { | ||
|  |             _mRealAsset = Asset as AttackClip; | ||
|  |         } | ||
|  |         public override void OnStay() | ||
|  |         { | ||
|  |             var skill = Owner.skill; | ||
|  |             var castDir = Owner.skill.CastDir; | ||
|  |             castDir = new Vector3(castDir.x, 0, castDir.z);//忽略y | ||
|  |             var param = _mRealAsset.template; | ||
|  | 
 | ||
|  |             void DealFunc(GameObject hitGo, Vector3 hitPos) | ||
|  |             { | ||
|  |                 var hitEntityId = 0; | ||
|  |                 EntityInfo info; | ||
|  |                 if (hitGo.TryGetComponent<EntityInfo>(out info)) | ||
|  |                 { | ||
|  |                     hitEntityId = info.entityId; | ||
|  |                     if (Util.GetEntity(hitEntityId).Team() == Owner.Team()) | ||
|  |                     { | ||
|  |                         return; | ||
|  |                     } | ||
|  |                 } | ||
|  |                 var hitKey = new Tuple<int, int>(hitEntityId, param.hitId); | ||
|  |                 if (!Owner.skill.SkillHitInfo.ContainsKey(hitKey)) | ||
|  |                 { | ||
|  |                     var skillHitInfo = new SkillHitInfo() | ||
|  |                     { | ||
|  |                         SkillParam = param, | ||
|  |                         AttackRate = 1, | ||
|  |                         StunkRate = 1, | ||
|  |                         ExecutekRate = 1, | ||
|  |                         OwnerEntity = Owner.ID(), | ||
|  |                         HitEntity = hitEntityId, | ||
|  |                         HitPos = hitPos, | ||
|  |                         HitDir = castDir, | ||
|  |                         IsRight = Owner.move.IsRight, | ||
|  |                         IsDealed = false, | ||
|  |                         SkillId = skill.SkillId.Value, | ||
|  |                         Performance = 0, | ||
|  |                         StaggerLevel = param.staggerLevel, | ||
|  |                         IsBreak = true, | ||
|  |                     }; | ||
|  |                     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; | ||
|  |                             skillHitInfo.ExecutekRate = featureSkill.ExecuteRate; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     Owner.skill.SkillHitInfo[hitKey] = skillHitInfo; | ||
|  | 
 | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             if (param.isRaycast) | ||
|  |             { | ||
|  |                 var posPre = Owner.PosPre(); | ||
|  |                 var pos = Owner.Pos(); | ||
|  |                 var distance = Vector3.Distance(pos, posPre); | ||
|  |                 var dir = pos - posPre; | ||
|  | 
 | ||
|  |                 var hitInfos = Physics.RaycastAll(posPre, dir, distance, UtilPhysics.LayerMaskHit); | ||
|  |                 Util.Draw(posPre, pos, Color.green); | ||
|  | 
 | ||
|  |                 foreach (var hitInfo in hitInfos) | ||
|  |                 { | ||
|  |                     var hitGo = hitInfo.transform.gameObject; | ||
|  |                     DealFunc(hitGo, hitInfo.point); | ||
|  |                 } | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 var rot = Quaternion.FromToRotation(Vector3.right, castDir); | ||
|  |                 var toGridSize = 16f / 64f; | ||
|  |                 var center = rot * param.center * toGridSize + Owner.Pos(); | ||
|  |                 var halfExtents = param.halfExtents * toGridSize; | ||
|  | 
 | ||
|  |                 var hitInfos = Physics.BoxCastAll(center, halfExtents, castDir, rot, 0, layerMask: UtilPhysics.LayerMaskHit); | ||
|  |                 Util.DrawBox(center, halfExtents, castDir, Color.green); | ||
|  | 
 | ||
|  |                 foreach (var hitInfo in hitInfos) | ||
|  |                 { | ||
|  |                     var hitGo = hitInfo.transform.gameObject; | ||
|  |                     DealFunc(hitGo, hitInfo.point); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |         } | ||
|  |         public override void OnLeave() | ||
|  |         { | ||
|  |         } | ||
|  |     } | ||
|  | } |