[c#]代码库
// 这个是寻找在范围内距离最近的目标的代码片段,适合用于武器锁定之类
// 是否开启寻找锁定器?
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) 回复
??
回复评论