// 这个是寻找在范围内距离最近的目标的代码片段,适合用于武器锁定之类 // 是否开启寻找锁定器? if(Seeker) { // 遍历所有目标对象 for (int t = 0; t < TargetTag.Length; t++) { if (GameObject.FindGameObjectsWithTag(TargetTag[t].Length > 0)) { GameObject[] objs = GameObject.FindGameObjectsWithTag(TargetTag[t]); float distance = int.MaxValue; for (int i = 0; i < objs.Length; i++) { if (objs[i]) { // 这两段代码的作用是用于计算对象与角色之间夹角的余弦值,再根据余弦值来判断对象是否在目标范围内 // 这里应用到的数学知识是两个向量a,b的点乘相当于a,b的模相乘,再与它们之间的余弦值相乘。 // 先求出对象与角色之间的方向向量,再单位化,则它的模就为1了 // transform.forward相对于角色前进方向(z轴)的方向向量,它的模是1 // 因此变量direction就是它们两个方向向量的余弦值了。 Vector3 dir = (objs[i].transform.position - transform.position).normalized; float direction = Vector3.Dot(dir, transform.forward); // 求得两个对象之间的距离 float dis = Vector3.Distance(obj[i].transform.position, transform.position); // 若果对象在目标范围之内, 记得direction是余弦值, if (direction >= AimDirection) { // 若果对象在目标距离之内 if (DistanceLock > dis) { // 选择距离最近的 if (distance > dis) { // 离上一次锁定的时间大于TimeToLock才能重新锁定 if (timeToLockCount + TimeToLock < Time.time) { distance = dis; target = objs[j]; } } } } } } } } } // 是否有锁定了的目标? if (target) { float targetDistance = Vector3.Distance(transform.position, target.transform.position); Vector3 dir = (target.transform.position - transform.position).normalized; float direction = Vector3.Dot(dir, transform.forward); // 若果已经锁定了的目标不再符合锁定的条件,就应该要解锁了 if (targetDistance > DistanceLock || direction <= AimDirection) { Unlock(); } } void Unlock() { // 保存解锁的时间 timeToLockCount = Time.time; target = null; }