void checkBulletStatus(List <kBulletStatus> status) { bool firstSide = false; float previousDistance = float.MinValue; for (int i = 0; i < status.Count; ++i) { kBulletStatus bs = status[i]; if (i == 0) { firstSide = bs.negativeSide; } else { if (!firstSide && bs.negativeSide) { Debug.LogError("bullet status order error!"); } } if (bs.distance < previousDistance) { Debug.LogError("bullet distance order error!"); } previousDistance = bs.distance; } }
public List <kBulletStatus> estimate(Vector3 targetPosition, eGameForce force) { int keyH = getLocomotionKey(targetPosition, Vector3.right); int keyV = getLocomotionKey(targetPosition, Vector3.forward); if (keyH == int.MinValue || keyV == int.MinValue) { Debug.LogWarning("TargetPosition is illegel!"); return(null); } bool hasKeyH = false; bool hasKeyV = false; hasKeyH = bulletLocomotion.ContainsKey(Mathf.Abs(keyH)); hasKeyV = bulletLocomotion.ContainsKey(Mathf.Abs(keyV)); if (!hasKeyH && !hasKeyV) { return(null); } List <kBulletStatus> dangerousBullets = new List <kBulletStatus>(); if (hasKeyH) { List <kBulletStatus> statusHorizonal = gatherBulletStatus(Mathf.Abs(keyH), targetPosition); if (statusHorizonal != null) { checkBulletStatus(statusHorizonal); estimateDangerousBullets(statusHorizonal, ref dangerousBullets); } } if (hasKeyV) { List <kBulletStatus> statusVertical = gatherBulletStatus(Mathf.Abs(keyV), targetPosition); if (statusVertical != null) { checkBulletStatus(statusVertical); estimateDangerousBullets(statusVertical, ref dangerousBullets); } } if (force != eGameForce.UNKNOWN_FORCE) { for (int i = 0; i < dangerousBullets.Count; ++i) { kBulletStatus status = dangerousBullets[i]; //if(status.bullet.force != force || Mathf.Abs(status.distance)/status.bullet.speed > 1.0f) if (status.bullet.force != force) { dangerousBullets.RemoveAt(i); i = 0; } } } return(dangerousBullets); }
List <kBulletStatus> gatherBulletStatus(int key, Vector3 targetPosition) { if (key < 0) { Debug.LogError("key must be a positive vaule!"); return(null); } List <Bullet> bullectList = bulletLocomotion[key] as List <Bullet>; if (bullectList.Count == 0) { return(null); } List <kBulletStatus> bulletStatus = new List <kBulletStatus>(); bool isHorizonal = key < 100; // sort from negative side to positive side bulletSorter.isHorizonal = isHorizonal; bullectList.Sort(bulletSorter); for (int i = 0; i < bullectList.Count; ++i) { Bullet singleBullet = bullectList[i]; if (Mathf.Abs(singleBullet.locomotionKey) != key) { Debug.LogError("Target bullet has a wrong locomotionKey!"); return(null); } Vector3 bulletPosition = singleBullet.transform.localPosition; float dotValue = Vector3.Dot(singleBullet.initDirection, targetPosition - bulletPosition); float distance = 0.0f; if (isHorizonal) { distance = bulletPosition.x - targetPosition.x; } else { distance = bulletPosition.z - targetPosition.z; } kBulletStatus newStatus = new kBulletStatus(); newStatus.toward = dotValue >= 0.0f; newStatus.distance = distance; newStatus.negativeSide = distance < 0.0f; newStatus.bullet = singleBullet; bulletStatus.Add(newStatus); } return(bulletStatus); }
void estimateDangerousBullets(List <kBulletStatus> status, ref List <kBulletStatus> result) { int dangerNegative = 0; int dangerPositive = 0; for (int i = 0; i < status.Count; ++i) { kBulletStatus bs = status[i]; if (bs.negativeSide) { if (bs.toward) { result.Add(bs); ++dangerNegative; } else { if (dangerNegative > 0) { result.RemoveAt(result.Count - 1); --dangerNegative; } } } else { if (bs.toward) { ++dangerPositive; if (dangerPositive > 0) { result.Add(bs); } } else { --dangerPositive; } } } }