|
|
@ -35,7 +35,7 @@ public class getNodeTools |
|
|
MapUnity currentCheckNode = currentNode; |
|
|
MapUnity currentCheckNode = currentNode; |
|
|
for (int i = 0; i < range; i++) |
|
|
for (int i = 0; i < range; i++) |
|
|
{ |
|
|
{ |
|
|
if (tryGetNode(currentCheckNode.unitPool[angle], results)) |
|
|
if (tryGetNodeFroPlayer(currentCheckNode.unitPool[angle], results)) |
|
|
{ |
|
|
{ |
|
|
currentCheckNode = currentCheckNode.unitPool[angle]; |
|
|
currentCheckNode = currentCheckNode.unitPool[angle]; |
|
|
} |
|
|
} |
|
|
@ -46,7 +46,7 @@ public class getNodeTools |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public static bool tryGetNode(MapUnity currentNode, HashSet<MapUnity> results) |
|
|
public static bool tryGetNodeFroPlayer(MapUnity currentNode, HashSet<MapUnity> results) |
|
|
{ |
|
|
{ |
|
|
bool canPass = true; |
|
|
bool canPass = true; |
|
|
if (currentNode == null) |
|
|
if (currentNode == null) |
|
|
@ -71,6 +71,30 @@ public class getNodeTools |
|
|
return canPass; |
|
|
return canPass; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static bool tryGetNodeForEnemy(MapUnity currentNode, HashSet<MapUnity> results) |
|
|
|
|
|
{ |
|
|
|
|
|
bool canPass = true; |
|
|
|
|
|
if (currentNode == null) |
|
|
|
|
|
{ |
|
|
|
|
|
canPass = false; |
|
|
|
|
|
return canPass; |
|
|
|
|
|
} |
|
|
|
|
|
/*if (currentNode.TryGetComponent<EnemyNode>(out EnemyNode enemyNode))*/ |
|
|
|
|
|
if (currentNode.enemyNode != null) |
|
|
|
|
|
{ |
|
|
|
|
|
if (currentNode.enemyNode.enemyType.Equals(EnemyNode.EnemyType.block)) |
|
|
|
|
|
{ |
|
|
|
|
|
canPass = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (canPass) |
|
|
|
|
|
{ |
|
|
|
|
|
results.Add(currentNode); |
|
|
|
|
|
} |
|
|
|
|
|
return canPass; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public static void getCircleNode(HashSet<MapUnity> nodeList,int range) |
|
|
public static void getCircleNode(HashSet<MapUnity> nodeList,int range) |
|
|
{ |
|
|
{ |
|
|
for (int i = 0;i < range;i++) |
|
|
for (int i = 0;i < range;i++) |
|
|
@ -78,6 +102,38 @@ public class getNodeTools |
|
|
getNearbyNode(nodeList); |
|
|
getNearbyNode(nodeList); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void getCircleNodeForEnemy(HashSet<MapUnity> nodeList, int range) |
|
|
|
|
|
{ |
|
|
|
|
|
for (int i = 0; i < range; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
getNearbyNodeFroEnemy(nodeList); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void exceptWithEnemyNode(HashSet<MapUnity> nodeList) |
|
|
|
|
|
{ |
|
|
|
|
|
List<MapUnity> mapUnityList = new List<MapUnity>(nodeList); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = mapUnityList.Count - 1; i >= 0; i--) |
|
|
|
|
|
{ |
|
|
|
|
|
if (mapUnityList[i].enemyNode!=null) |
|
|
|
|
|
{ |
|
|
|
|
|
mapUnityList.RemoveAt(i); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
nodeList.Clear(); |
|
|
|
|
|
nodeList.UnionWith(mapUnityList); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void getArcNode(HashSet<MapUnity> nodeList, int range) |
|
|
|
|
|
{ |
|
|
|
|
|
HashSet<MapUnity> smallCircleNodeSet=new HashSet<MapUnity>(nodeList); |
|
|
|
|
|
getCircleNodeForEnemy(smallCircleNodeSet, range-1); |
|
|
|
|
|
getCircleNodeForEnemy(nodeList, range); |
|
|
|
|
|
nodeList.ExceptWith(smallCircleNodeSet); |
|
|
|
|
|
} |
|
|
public static void getNearbyNode(HashSet<MapUnity> nodeList) |
|
|
public static void getNearbyNode(HashSet<MapUnity> nodeList) |
|
|
{ |
|
|
{ |
|
|
// 创建一个副本以避免遍历时修改原集合
|
|
|
// 创建一个副本以避免遍历时修改原集合
|
|
|
@ -88,7 +144,26 @@ public class getNodeTools |
|
|
{ |
|
|
{ |
|
|
for (int i = 0; i < 6; i++) |
|
|
for (int i = 0; i < 6; i++) |
|
|
{ |
|
|
{ |
|
|
tryGetNode(node.unitPool[i], nodesToAdd); |
|
|
tryGetNodeFroPlayer(node.unitPool[i], nodesToAdd); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 遍历完成后统一修改原集合
|
|
|
|
|
|
nodeList.AddRange(nodesToAdd); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void getNearbyNodeFroEnemy(HashSet<MapUnity> nodeList) |
|
|
|
|
|
{ |
|
|
|
|
|
// 创建一个副本以避免遍历时修改原集合
|
|
|
|
|
|
HashSet<MapUnity> nodesCopy = new HashSet<MapUnity>(nodeList); |
|
|
|
|
|
HashSet<MapUnity> nodesToAdd = new HashSet<MapUnity>(); // 临时列表存储要添加的节点
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var node in nodesCopy) |
|
|
|
|
|
{ |
|
|
|
|
|
for (int i = 0; i < 6; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
tryGetNodeForEnemy(node.unitPool[i], nodesToAdd); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -97,6 +172,46 @@ public class getNodeTools |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void getCircleNodeForRemoteAttack(HashSet<MapUnity> nodeList, int range) |
|
|
|
|
|
{ |
|
|
|
|
|
for (int i = 0; i < range; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
getNearbyNodeForRemoteAttack(nodeList); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void getNearbyNodeForRemoteAttack(HashSet<MapUnity> nodeList) |
|
|
|
|
|
{ |
|
|
|
|
|
// 创建一个副本以避免遍历时修改原集合
|
|
|
|
|
|
HashSet<MapUnity> nodesCopy = new HashSet<MapUnity>(nodeList); |
|
|
|
|
|
HashSet<MapUnity> nodesToAdd = new HashSet<MapUnity>(); // 临时列表存储要添加的节点
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var node in nodesCopy) |
|
|
|
|
|
{ |
|
|
|
|
|
for (int i = 0; i < 6; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
tryGetNodeForRemoteAttack(node.unitPool[i], nodesToAdd); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
// 遍历完成后统一修改原集合
|
|
|
|
|
|
nodeList.AddRange(nodesToAdd); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static bool tryGetNodeForRemoteAttack(MapUnity currentNode, HashSet<MapUnity> results) |
|
|
|
|
|
{ |
|
|
|
|
|
bool canPass = true; |
|
|
|
|
|
if (currentNode == null) |
|
|
|
|
|
{ |
|
|
|
|
|
canPass = false; |
|
|
|
|
|
} |
|
|
|
|
|
if (canPass) |
|
|
|
|
|
{ |
|
|
|
|
|
results.Add(currentNode); |
|
|
|
|
|
} |
|
|
|
|
|
return canPass; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public static void checkListPass(HashSet<MapUnity> mapUnitySet, MapUnity mapUnity) |
|
|
public static void checkListPass(HashSet<MapUnity> mapUnitySet, MapUnity mapUnity) |
|
|
{ |
|
|
{ |
|
|
List<MapUnity> mapUnityList=new List<MapUnity>(mapUnitySet); |
|
|
List<MapUnity> mapUnityList=new List<MapUnity>(mapUnitySet); |
|
|
@ -112,6 +227,21 @@ public class getNodeTools |
|
|
mapUnitySet.UnionWith(mapUnityList); |
|
|
mapUnitySet.UnionWith(mapUnityList); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void checkListShootPass(HashSet<MapUnity> mapUnitySet,int range) |
|
|
|
|
|
{ |
|
|
|
|
|
List<MapUnity> mapUnityList = new List<MapUnity>(mapUnitySet); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = mapUnityList.Count - 1; i >= 0; i--) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!canRemoteAttack(mapUnityList[i],range)) |
|
|
|
|
|
{ |
|
|
|
|
|
mapUnityList.RemoveAt(i); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
mapUnitySet.Clear(); |
|
|
|
|
|
mapUnitySet.UnionWith(mapUnityList); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public static bool checkNodePass(MapUnity mapUnity, MapUnity centerMapUnity) |
|
|
public static bool checkNodePass(MapUnity mapUnity, MapUnity centerMapUnity) |
|
|
{ |
|
|
{ |
|
|
LayerMask layerMask = new LayerMask(); |
|
|
LayerMask layerMask = new LayerMask(); |
|
|
@ -145,11 +275,55 @@ public class getNodeTools |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Debug.Log("距离是" + distance + ",结果是:" + canPass + ",角度是:" + dir + " " + layerMask.value + "ray是" + ray + "X是:" + mapUnity.locationX + "Y是:" + mapUnity.locationY);
|
|
|
|
|
|
return canPass; |
|
|
return canPass; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*public static bool checkNodeShootPass(MapUnity mapUnity, MapUnity centerMapUnity,int range) |
|
|
|
|
|
{ |
|
|
|
|
|
LayerMask layerMask = new LayerMask(); |
|
|
|
|
|
int blockLayer = LayerMask.NameToLayer("Block"); |
|
|
|
|
|
layerMask |= (1 << blockLayer); |
|
|
|
|
|
int playerLayer = LayerMask.NameToLayer("Player"); |
|
|
|
|
|
layerMask |= (1 << playerLayer); |
|
|
|
|
|
bool canPass = false; |
|
|
|
|
|
//MapUnity playerOnNode = GameManager.Instance.playerOn.transform.GetComponent<MapUnity>();
|
|
|
|
|
|
//var playerOnNode=GameManager.Instance.player;
|
|
|
|
|
|
float distance = Vector3.Distance(mapUnity.transform.position, centerMapUnity.transform.position); |
|
|
|
|
|
Vector3 dir = centerMapUnity.transform.position - mapUnity.transform.position; |
|
|
|
|
|
Ray ray = new Ray(mapUnity.transform.position, dir); |
|
|
|
|
|
if (Physics.Raycast(ray, out RaycastHit raycastHit, 500, layerMask.value)) |
|
|
|
|
|
{ |
|
|
|
|
|
if (raycastHit.collider.tag == "Player" && distance <= range + 0.5f) |
|
|
|
|
|
{ |
|
|
|
|
|
canPass = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return canPass; |
|
|
|
|
|
|
|
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static bool canRemoteAttack(MapUnity currentNode,int attackRange) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
bool canAttack = false; |
|
|
|
|
|
bool inShootRange = false; |
|
|
|
|
|
bool canPass = false; |
|
|
|
|
|
HashSet<MapUnity> shootAbleSet = new HashSet<MapUnity>(); |
|
|
|
|
|
shootAbleSet.Add(currentNode); |
|
|
|
|
|
getCircleNodeForRemoteAttack(shootAbleSet,attackRange); |
|
|
|
|
|
if (shootAbleSet.Contains(GameManager.Instance.playerOn)) |
|
|
|
|
|
{ |
|
|
|
|
|
inShootRange = true; |
|
|
|
|
|
} |
|
|
|
|
|
canPass = getNodeTools.checkNodePass(currentNode, GameManager.Instance.playerOn); |
|
|
|
|
|
if (canPass && inShootRange) |
|
|
|
|
|
{ |
|
|
|
|
|
canAttack = true; |
|
|
|
|
|
} |
|
|
|
|
|
return canAttack; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|