|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace Game
|
|
|
|
|
@ -18,6 +19,7 @@ namespace Game
|
|
|
|
|
public class ClipAttack : TimelineClipBase
|
|
|
|
|
{
|
|
|
|
|
private AttackClip _mRealAsset;
|
|
|
|
|
private List<GameEntity> _tempTargetList = new List<GameEntity>();
|
|
|
|
|
|
|
|
|
|
public override void OnEnter()
|
|
|
|
|
{
|
|
|
|
|
@ -29,23 +31,33 @@ namespace Game
|
|
|
|
|
var param = _mRealAsset.template;
|
|
|
|
|
var skill = Owner.skill;
|
|
|
|
|
var castShape = param.Shape;
|
|
|
|
|
var castDir = Owner.skill.CastDir;
|
|
|
|
|
var castDir = 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);
|
|
|
|
|
_tempTargetList.Clear();
|
|
|
|
|
Util.ForeachEnemies(Owner.Team(), target =>
|
|
|
|
|
{
|
|
|
|
|
var isHit = UtilShape.IsOverlap(castShape, castPos, castDir, target.hp.HitBoxShape, target.Pos());
|
|
|
|
|
if (!isHit) return;
|
|
|
|
|
|
|
|
|
|
var targetID = target.ID();
|
|
|
|
|
|
|
|
|
|
var hitKey = new Tuple<int, int>(targetID, param.hitId);
|
|
|
|
|
if (Owner.skill.HitSet.Contains(hitKey)) return;
|
|
|
|
|
Owner.skill.HitSet.Add(hitKey);
|
|
|
|
|
var hitKey = new Tuple<int, int>(target.ID(), param.hitId);
|
|
|
|
|
if (skill.HitSet.Contains(hitKey)) return;
|
|
|
|
|
skill.HitSet.Add(hitKey);
|
|
|
|
|
|
|
|
|
|
_tempTargetList.Add(target);
|
|
|
|
|
});
|
|
|
|
|
_tempTargetList.Sort((l, r) =>
|
|
|
|
|
{
|
|
|
|
|
var lRank = GetRank(param.hitDirType, l, castPos, castDir);
|
|
|
|
|
var rRank = GetRank(param.hitDirType, r, castPos, castDir);
|
|
|
|
|
return lRank.CompareTo(rRank);
|
|
|
|
|
});
|
|
|
|
|
foreach (var target in _tempTargetList)
|
|
|
|
|
{
|
|
|
|
|
var targetID = target.ID();
|
|
|
|
|
var skillHitInfo = new SkillHitInfo
|
|
|
|
|
{
|
|
|
|
|
SkillParam = param,
|
|
|
|
|
@ -68,12 +80,41 @@ namespace Game
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
target.skill.HitInfo.Add(skillHitInfo);
|
|
|
|
|
});
|
|
|
|
|
skill.HitInfo.Enqueue(skillHitInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private float GetRank(EHitDirType hitDirType, GameEntity target, Vector3 castPos, Vector3 castDir)
|
|
|
|
|
{
|
|
|
|
|
//小在前
|
|
|
|
|
var targetPos = target.Pos();
|
|
|
|
|
var targetDir = targetPos - castPos;
|
|
|
|
|
switch (hitDirType)
|
|
|
|
|
{
|
|
|
|
|
case EHitDirType.Center:
|
|
|
|
|
//按距离
|
|
|
|
|
return Vector3.Distance(targetPos, castPos);
|
|
|
|
|
case EHitDirType.Backward:
|
|
|
|
|
//从前往后
|
|
|
|
|
return -Vector3.Dot(targetDir, castDir);
|
|
|
|
|
case EHitDirType.Forward:
|
|
|
|
|
//从后往前
|
|
|
|
|
return Vector3.Dot(targetDir, castDir);
|
|
|
|
|
case EHitDirType.Clockwise:
|
|
|
|
|
//顺时针
|
|
|
|
|
return -GetRankRot(castDir, targetDir);
|
|
|
|
|
case EHitDirType.CounterClockwise:
|
|
|
|
|
//逆时针
|
|
|
|
|
return GetRankRot(castDir, targetDir);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnLeave()
|
|
|
|
|
private float GetRankRot(Vector3 castDir, Vector3 targetDir)
|
|
|
|
|
{
|
|
|
|
|
var rot = Quaternion.FromToRotation(-castDir, Vector3.right);
|
|
|
|
|
return Util.Vec3ToRot(rot * targetDir) * (Owner.move.IsRight ? 1 : -1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|