// 这个是寻找在范围内距离最近的目标的代码片段,适合用于武器锁定之类 |
// 是否开启寻找锁定器? |
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 ; |
} |
by: 发表于:2018-01-08 10:20:40 顶(0) | 踩(0) 回复
??
回复评论