|
|
@@ -69,21 +69,30 @@ public class SearchTrigger : MonoBehaviour
|
|
|
|
|
|
private void FixedUpdate()
|
|
|
{
|
|
|
- for (int i = 0; i < owner.attackController.targetTypes.Count; i++)
|
|
|
+ var targetTypes = owner.attackController.targetTypes;
|
|
|
+ for (int i = 0; i < targetTypes.Count; i++)
|
|
|
{
|
|
|
- if (trigCharacterDic.ContainsKey(owner.attackController.targetTypes[i]))
|
|
|
+ TargetType targetType = targetTypes[i];
|
|
|
+
|
|
|
+ if (!trigCharacterDic.TryGetValue(targetType, out var trigList) ||trigList == null || trigList.Count == 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ for (int j = trigList.Count - 1; j >= 0; j--)
|
|
|
{
|
|
|
- List<BeSearchTrigger> trigList = trigCharacterDic[owner.attackController.targetTypes[i]];
|
|
|
- for (int j = trigList.Count - 1; j >= 0; j--)
|
|
|
+ BeSearchTrigger trigger = trigList[j];
|
|
|
+ if (trigger == null)
|
|
|
+ {
|
|
|
+ trigList.RemoveAt(j);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Character triggerOwner = trigger.owner;
|
|
|
+ if (!trigger.enabled || !trigger.gameObject.activeInHierarchy || triggerOwner.isDie)
|
|
|
{
|
|
|
- if (trigList[j] == null || !trigList[j].enabled || !trigList[j].gameObject.activeInHierarchy || trigList[j].owner.isDie)
|
|
|
+ if (triggerOwner == owner.targetCharacter)
|
|
|
{
|
|
|
- if (trigList[j].owner == owner.targetCharacter)
|
|
|
- {
|
|
|
- owner.targetCharacter = null;
|
|
|
- }
|
|
|
- trigList.RemoveAt(j);
|
|
|
+ owner.targetCharacter = null;
|
|
|
}
|
|
|
+ trigList.RemoveAt(j);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -91,35 +100,45 @@ public class SearchTrigger : MonoBehaviour
|
|
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
|
{
|
|
|
- BeSearchTrigger trigger = other.GetComponent<BeSearchTrigger>();
|
|
|
- if (trigger)
|
|
|
- {
|
|
|
- TargetType otherTargetType = (TargetType)Enum.Parse(typeof(TargetType), trigger.owner.tag);
|
|
|
+ if (!other.TryGetComponent(out BeSearchTrigger trigger)) return;
|
|
|
|
|
|
- if (HasTargetType(otherTargetType) && trigCharacterDic.ContainsKey(otherTargetType))
|
|
|
- {
|
|
|
- trigCharacterDic[otherTargetType].Add(trigger);
|
|
|
- }
|
|
|
+ if (!TryGetTargetTypeFromTag(trigger.owner.tag, out TargetType otherTargetType)) return;
|
|
|
+
|
|
|
+ if (HasTargetType(otherTargetType) && trigCharacterDic.TryGetValue(otherTargetType, out var triggerList))
|
|
|
+ {
|
|
|
+ triggerList.Add(trigger);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void OnTriggerExit(Collider other)
|
|
|
{
|
|
|
- BeSearchTrigger trigger = other.GetComponent<BeSearchTrigger>();
|
|
|
- if (trigger)
|
|
|
+ if (!other.TryGetComponent(out BeSearchTrigger trigger)) return;
|
|
|
+
|
|
|
+ Character triggerOwner = trigger.owner;
|
|
|
+ if (triggerOwner == null) return;
|
|
|
+
|
|
|
+ bool isCurrentTarget = triggerOwner == owner.targetCharacter;
|
|
|
+
|
|
|
+ if (!TryGetTargetTypeFromTag(triggerOwner.tag, out TargetType otherTargetType)) return;
|
|
|
+
|
|
|
+ if (!HasTargetType(otherTargetType)) return;
|
|
|
+
|
|
|
+ if (trigCharacterDic.TryGetValue(otherTargetType, out var triggerList))
|
|
|
{
|
|
|
- TargetType otherTargetType = (TargetType)Enum.Parse(typeof(TargetType), trigger.owner.tag);
|
|
|
- if (HasTargetType(otherTargetType) && trigCharacterDic.ContainsKey(otherTargetType))
|
|
|
+ triggerList.Remove(trigger);
|
|
|
+
|
|
|
+ if (isCurrentTarget)
|
|
|
{
|
|
|
- if (trigger.owner == owner.targetCharacter)
|
|
|
- {
|
|
|
- owner.targetCharacter = null;
|
|
|
- }
|
|
|
- trigCharacterDic[otherTargetType].Remove(trigger);
|
|
|
+ owner.targetCharacter = null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private bool TryGetTargetTypeFromTag(string tag, out TargetType targetType)
|
|
|
+ {
|
|
|
+ return GameManager.TagToTargetTypeMap.TryGetValue(tag, out targetType);
|
|
|
+ }
|
|
|
+
|
|
|
public bool HasTargetType(TargetType targetType)
|
|
|
{
|
|
|
return targetTypeDic.ContainsKey(targetType);
|
|
|
@@ -130,31 +149,12 @@ public class SearchTrigger : MonoBehaviour
|
|
|
List<Character> list = new List<Character>();
|
|
|
for (int i = 0; i < targetTypes.Count; i++)
|
|
|
{
|
|
|
- if (trigCharacterDic.ContainsKey(targetTypes[i]))
|
|
|
+ TargetType targetType = targetTypes[i];
|
|
|
+ if (trigCharacterDic.TryGetValue(targetType, out List<BeSearchTrigger> trigList))
|
|
|
{
|
|
|
- List<BeSearchTrigger> trigList = trigCharacterDic[targetTypes[i]];
|
|
|
- switch (targetTypes[i])
|
|
|
+ switch (targetType)
|
|
|
{
|
|
|
case TargetType.Demonic:
|
|
|
- for (int j = 0; j < trigList.Count; j++)
|
|
|
- {
|
|
|
- Character character = trigList[j].owner;
|
|
|
- if (!character.gameObject.activeInHierarchy || character.isDie)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (owner == character)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- Demonic demonic = trigList[j].owner as Demonic;
|
|
|
- if (demonic.canFly && !canHitFly)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- list.Add(trigList[j].owner);
|
|
|
- }
|
|
|
- break;
|
|
|
case TargetType.Enemy:
|
|
|
for (int j = 0; j < trigList.Count; j++)
|
|
|
{
|
|
|
@@ -167,8 +167,7 @@ public class SearchTrigger : MonoBehaviour
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
- Enemy enemy = trigList[j].owner as Enemy;
|
|
|
- if (enemy.canFly && !canHitFly)
|
|
|
+ if (character.canFly && !canHitFly)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
@@ -208,6 +207,20 @@ public class SearchTrigger : MonoBehaviour
|
|
|
return null;
|
|
|
}
|
|
|
List<Character> list = GetAllTargets(targetTypes, canHitFly);
|
|
|
+
|
|
|
+ Vector3 ownerPosition = owner.transform.position;
|
|
|
+ Vector3 ownerBodyScale = owner.bodyTrans.localScale;
|
|
|
+ AttackController.AttackMethod am = owner.attackController.curAttackMethod;
|
|
|
+ bool isShootAttack = am.attackType == AttackController.AttackType.Shoot;
|
|
|
+ float upAngle = 0f;
|
|
|
+ float downAngle = 0f;
|
|
|
+
|
|
|
+ if (isShootAttack)
|
|
|
+ {
|
|
|
+ upAngle = am.maxUpAngle;
|
|
|
+ downAngle = am.maxDownAngle;
|
|
|
+ }
|
|
|
+
|
|
|
switch (searchMode)
|
|
|
{
|
|
|
case SearchMode.MinDistance:
|
|
|
@@ -217,20 +230,17 @@ public class SearchTrigger : MonoBehaviour
|
|
|
{
|
|
|
Character character = list[i];
|
|
|
//判断对象是否在远程单位的射击夹角范围内
|
|
|
- AttackController.AttackMethod am = owner.attackController.curAttackMethod;
|
|
|
- if (am.attackType == AttackController.AttackType.Shoot)
|
|
|
+ if (isShootAttack)
|
|
|
{
|
|
|
- float up = am.maxUpAngle;
|
|
|
- float down = am.maxDownAngle;
|
|
|
Vector3 dir = character.beSearchTrigger.transform.position - transform.position;
|
|
|
- float angle = Vector3.Angle(dir, Vector3.left * owner.bodyTrans.localScale.x);
|
|
|
- if ((dir.y > 0 && angle > up) || (dir.y < 0 && angle > down))
|
|
|
+ float angle = Vector3.Angle(dir, Vector3.left * ownerBodyScale.x);
|
|
|
+ if ((dir.y > 0 && angle > upAngle) || (dir.y < 0 && angle > downAngle))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
|
//判断是否在攻击范围内
|
|
|
- float distance = Mathf.Abs(character.transform.position.x - owner.transform.position.x);
|
|
|
+ float distance = Mathf.Abs(character.transform.position.x - ownerPosition.x);
|
|
|
if (minDisChar == null || minDistance == -1 || minDistance > distance)
|
|
|
{
|
|
|
minDisChar = character;
|
|
|
@@ -245,20 +255,17 @@ public class SearchTrigger : MonoBehaviour
|
|
|
{
|
|
|
Character character = list[i];
|
|
|
//判断对象是否在远程单位的射击夹角范围内
|
|
|
- AttackController.AttackMethod am = owner.attackController.curAttackMethod;
|
|
|
- if (am.attackType == AttackController.AttackType.Shoot)
|
|
|
+ if (isShootAttack)
|
|
|
{
|
|
|
- float up = am.maxUpAngle;
|
|
|
- float down = am.maxDownAngle;
|
|
|
Vector3 dir = character.beSearchTrigger.transform.position - transform.position;
|
|
|
- float angle = Vector3.Angle(dir, Vector3.left * owner.bodyTrans.localScale.x);
|
|
|
- if ((dir.y > 0 && angle > up) || (dir.y < 0 && angle > down))
|
|
|
+ float angle = Vector3.Angle(dir, Vector3.left * ownerBodyScale.x);
|
|
|
+ if ((dir.y > 0 && angle > upAngle) || (dir.y < 0 && angle > downAngle))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
|
//判断是否在攻击范围内
|
|
|
- float distance = Mathf.Abs(character.transform.position.x - owner.transform.position.x);
|
|
|
+ float distance = Mathf.Abs(character.transform.position.x - ownerPosition.x);
|
|
|
if (maxDisChar == null || maxDistance == -1 || maxDistance < distance)
|
|
|
{
|
|
|
maxDisChar = character;
|
|
|
@@ -273,14 +280,11 @@ public class SearchTrigger : MonoBehaviour
|
|
|
{
|
|
|
Character character = list[i];
|
|
|
//判断对象是否在远程单位的射击夹角范围内
|
|
|
- AttackController.AttackMethod am = owner.attackController.curAttackMethod;
|
|
|
- if (am.attackType == AttackController.AttackType.Shoot)
|
|
|
+ if (isShootAttack)
|
|
|
{
|
|
|
- float up = am.maxUpAngle;
|
|
|
- float down = am.maxDownAngle;
|
|
|
Vector3 dir = character.beSearchTrigger.transform.position - transform.position;
|
|
|
- float angle = Vector3.Angle(dir, Vector3.left * owner.bodyTrans.localScale.x);
|
|
|
- if ((dir.y > 0 && angle > up) || (dir.y < 0 && angle > down))
|
|
|
+ float angle = Vector3.Angle(dir, Vector3.left * ownerBodyScale.x);
|
|
|
+ if ((dir.y > 0 && angle > upAngle) || (dir.y < 0 && angle > downAngle))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
@@ -297,14 +301,11 @@ public class SearchTrigger : MonoBehaviour
|
|
|
{
|
|
|
Character character = list[i];
|
|
|
//判断对象是否在远程单位的射击夹角范围内
|
|
|
- AttackController.AttackMethod am = owner.attackController.curAttackMethod;
|
|
|
- if (am.attackType == AttackController.AttackType.Shoot)
|
|
|
+ if (isShootAttack)
|
|
|
{
|
|
|
- float up = am.maxUpAngle;
|
|
|
- float down = am.maxDownAngle;
|
|
|
Vector3 dir = character.beSearchTrigger.transform.position - transform.position;
|
|
|
- float angle = Vector3.Angle(dir, Vector3.left * owner.bodyTrans.localScale.x);
|
|
|
- if ((dir.y > 0 && angle > up) || (dir.y < 0 && angle > down))
|
|
|
+ float angle = Vector3.Angle(dir, Vector3.left * ownerBodyScale.x);
|
|
|
+ if ((dir.y > 0 && angle > upAngle) || (dir.y < 0 && angle > downAngle))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
@@ -318,32 +319,6 @@ public class SearchTrigger : MonoBehaviour
|
|
|
case SearchMode.ByType:
|
|
|
break;
|
|
|
}
|
|
|
- //Character minDisChar = null;
|
|
|
- //float minDistance = -1;
|
|
|
- //for (int i = 0; i < list.Count; i++)
|
|
|
- //{
|
|
|
- // Character character = list[i];
|
|
|
- // //判断对象是否在远程单位的射击夹角范围内
|
|
|
- // AttackController.AttackMethod am = owner.attackController.curAttackMethod;
|
|
|
- // if (am.attackType == AttackController.AttackType.Shoot)
|
|
|
- // {
|
|
|
- // float up = am.maxUpAngle;
|
|
|
- // float down = am.maxDownAngle;
|
|
|
- // Vector3 dir = character.beSearchTrigger.transform.position - transform.position;
|
|
|
- // float angle = Vector3.Angle(dir, Vector3.left * owner.bodyTrans.localScale.x);
|
|
|
- // if ((dir.y > 0 && angle > up) || (dir.y < 0 && angle > down))
|
|
|
- // {
|
|
|
- // continue;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // //判断是否在攻击范围内
|
|
|
- // float distance = Mathf.Abs(character.transform.position.x - owner.transform.position.x);
|
|
|
- // if (minDisChar == null || minDistance == -1 || minDistance > distance)
|
|
|
- // {
|
|
|
- // minDisChar = character;
|
|
|
- // minDistance = distance;
|
|
|
- // }
|
|
|
- //}
|
|
|
return null;
|
|
|
}
|
|
|
|