FPS遊戲之視野
阿新 • • 發佈:2018-11-12
最近在做策劃給的一些關於FPS型別的需求,Demo基本已經成型,接下來整理並記錄,高手略過,不喜勿噴!!!
1.扇形檢測區域
/// <summary> /// 傘形檢測範圍 /// </summary> /// <param name="self">自身</param> /// <param name="emeny">敵方</param> /// <param name="angle">傘形角度</param> /// <param name="radius">傘形半徑</param> /// <returns></returns> public bool SectorDetection(Transform self, Transform emeny, float angle, float radius) { Vector3 deltaA = emeny.position - self.position; float tmpAngle = Mathf.Acos(Vector3.Dot(deltaA.normalized, self.forward)) * Mathf.Rad2Deg; if (tmpAngle < angle * 0.5f && deltaA.magnitude < radius) { Debug.Log("視野內"); return true; } return false; }
如果enemy的角度大於1/2*angle以及enemy到self的距離大於radius,則不再self的視野範圍內
2.另外一種兩個三角形檢測區域
void SectorDetection() { Quaternion right = transform.rotation * Quaternion.AngleAxis(angleRadius, Vector3.up); Quaternion left = transform.rotation * Quaternion.AngleAxis(angleRadius, Vector3.down); Vector3 n = /*transform.position + */Vector3.forward * RayDistance; Vector3 leftPoint = left * n; Vector3 rightPoint = right * n; Debug.DrawRay(RayVector.position, leftPoint, Color.red); Debug.DrawRay(RayVector.position, rightPoint, Color.red); Vector3 targetDir = player.transform.position - transform.position; Vector3 forward = transform.forward; acutalDiatance = Vector3.Distance(player.transform.position, this.transform.position); float angle = Vector3.Angle(targetDir, forward); if (angle < angleRadius && acutalDiatance < RayDistance) { Debug.Log("在視野範圍內"); } }