SkillHitRange.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System;
  5. public class SkillHitRange
  6. {
  7. LogicTransformHitType mHitType;
  8. Vector3 mCenter;
  9. Vector3 mForward;
  10. Vector3 mSize;
  11. List<Fighter> mTempHitFighterList;
  12. bool mIsValid = false;
  13. public Vector3 Center { get { return mCenter; } }
  14. public Vector3 Forward { get { return mForward; } }
  15. public Vector3 Size { get { return mSize; } }
  16. public void Set (Fighter caster, Fighter target, SkillActionAttackInfo attackInfo, Bullet bullet = null)
  17. {
  18. mIsValid = false;
  19. Vector3 boundDir = Vector3.forward;
  20. Vector3 boundPos = new Vector3 (0, attackInfo.rangeOffsetY, attackInfo.rangeOffsetX);
  21. Vector3 boundSize = new Vector3 (attackInfo.rangeX + target.ModelSize, attackInfo.rangeY+target.ModelSize, target.ModelSize);
  22. if (attackInfo.rangeType == SkillRangeType.RangeType_Caster)
  23. {
  24. boundPos = caster.TransformPoint (boundPos);
  25. boundDir = caster.Forward;
  26. }
  27. else if (attackInfo.rangeType == SkillRangeType.RangeType_Target)
  28. {
  29. if (target != null) {
  30. boundPos = target.TransformPoint (boundPos);
  31. boundDir = target.Forward;
  32. } else
  33. return;
  34. }
  35. else if (attackInfo.rangeType == SkillRangeType.RangeType_Position)
  36. {
  37. boundDir = caster.Forward;
  38. boundPos = caster.TransformPoint (boundPos + Vector3.forward * attackInfo.skill.GetSkillDist((int)caster.ProfType));
  39. }
  40. else if (attackInfo.rangeType == SkillRangeType.RangeType_Bullet)
  41. {
  42. if (bullet != null) {
  43. boundDir = bullet.Forward;
  44. boundPos = bullet.TransformPoint (boundPos);
  45. } else
  46. return;
  47. } else
  48. return;
  49. if (attackInfo.normalizeRangeDir && caster.CurrentBattleField != null)
  50. {
  51. if (Vector3.Dot (boundDir, caster.CurrentBattleField.Forward) < 0)
  52. boundDir = -caster.CurrentBattleField.Forward;
  53. else
  54. boundDir = caster.CurrentBattleField.Forward;
  55. }
  56. mHitType = LogicTransformHitType.Box;
  57. mCenter = boundPos;
  58. mSize = boundSize;
  59. mForward = boundDir;
  60. mIsValid = true;
  61. }
  62. public bool CheckHitFighter (Fighter fighter, Nullable<Vector3> centerPos= null,string linkName = "")
  63. {
  64. Vector3 pos = fighter.Position;
  65. if(!string.IsNullOrEmpty(linkName))
  66. {
  67. pos = fighter.Ctrl.GetPosByLink(linkName);
  68. }
  69. Vector3 cPos = mCenter;
  70. if(centerPos!=null)
  71. {
  72. cPos = centerPos.Value;
  73. }
  74. return mIsValid && fighter.CheckHitBoxUnscrict(pos, cPos, mForward, mSize);
  75. }
  76. public void SortFightersByCenterDistance (List<Fighter> fighters)
  77. {
  78. CommonUtil.SortList(fighters, (a, b)=>
  79. {
  80. float ld = Vector3.SqrMagnitude(a.Position - mCenter);
  81. float rd = Vector3.SqrMagnitude(b.Position - mCenter);
  82. return ld < rd ? -1 : (ld > rd ? 1 : 0);
  83. });
  84. }
  85. public List<Fighter> GetSkillHitFighters (Fighter caster, BaseSkill skill, List<Fighter> checkList, bool isBulletHit = false, List<Fighter> exceptList = null)
  86. {
  87. if (mTempHitFighterList == null)
  88. mTempHitFighterList = new List<Fighter> ();
  89. mTempHitFighterList.Clear ();
  90. //int maxCount = skill.SkillDataInfo.maxTargetNumber;
  91. int maxCount = 1;
  92. if (exceptList != null)
  93. maxCount -= exceptList.Count;
  94. if (maxCount <= 0)
  95. return mTempHitFighterList;
  96. for (int i = 0; i < checkList.Count; i++) {
  97. Fighter f = checkList[i];
  98. if (SkillSelectHelper.CheckTargetSelectable (skill, caster, f)
  99. && CheckHitFighter (f)
  100. && (exceptList == null || !exceptList.Contains (f)))
  101. mTempHitFighterList.Add (f);
  102. }
  103. if (isBulletHit || mTempHitFighterList.Count > maxCount)
  104. SortFightersByCenterDistance (mTempHitFighterList);
  105. if (mTempHitFighterList.Count > maxCount)
  106. mTempHitFighterList = mTempHitFighterList.GetRange (0, maxCount);
  107. return mTempHitFighterList;
  108. }
  109. }