[C#] Unity3d中寻找并锁定对象 →→→→→进入此内容的聊天室

来自 , 2019-08-06, 写在 C#, 查看 102 次.
URL http://www.code666.cn/view/c61fbef6
  1. // 这个是寻找在范围内距离最近的目标的代码片段,适合用于武器锁定之类
  2.  
  3. // 是否开启寻找锁定器?
  4. if(Seeker) {
  5.         // 遍历所有目标对象
  6.         for (int t = 0; t < TargetTag.Length; t++) {
  7.                 if (GameObject.FindGameObjectsWithTag(TargetTag[t].Length > 0)) {
  8.                         GameObject[] objs = GameObject.FindGameObjectsWithTag(TargetTag[t]);
  9.  
  10.                         float distance = int.MaxValue;
  11.                         for (int i = 0; i < objs.Length; i++) {
  12.                                 if (objs[i]) {
  13.                                         // 这两段代码的作用是用于计算对象与角色之间夹角的余弦值,再根据余弦值来判断对象是否在目标范围内
  14.                                         // 这里应用到的数学知识是两个向量a,b的点乘相当于a,b的模相乘,再与它们之间的余弦值相乘。
  15.                                         // 先求出对象与角色之间的方向向量,再单位化,则它的模就为1了
  16.                                         // transform.forward相对于角色前进方向(z轴)的方向向量,它的模是1
  17.                                         // 因此变量direction就是它们两个方向向量的余弦值了。
  18.                                         Vector3 dir = (objs[i].transform.position - transform.position).normalized;
  19.                                         float direction = Vector3.Dot(dir, transform.forward);
  20.  
  21.                                         // 求得两个对象之间的距离
  22.                                         float dis = Vector3.Distance(obj[i].transform.position, transform.position);
  23.  
  24.                                         // 若果对象在目标范围之内, 记得direction是余弦值,
  25.                                         if (direction >= AimDirection) {
  26.                                                 // 若果对象在目标距离之内
  27.                                                 if (DistanceLock > dis) {
  28.                                                         // 选择距离最近的
  29.                                                         if (distance > dis) {
  30.                                                                 // 离上一次锁定的时间大于TimeToLock才能重新锁定
  31.                                                                 if (timeToLockCount + TimeToLock < Time.time) {
  32.                                                                         distance = dis;
  33.                                                                         target = objs[j];
  34.                                                                 }
  35.                                                         }
  36.                                                 }
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.         }
  42. }
  43.  
  44. // 是否有锁定了的目标?
  45. if (target) {
  46.         float targetDistance = Vector3.Distance(transform.position, target.transform.position);
  47.         Vector3 dir = (target.transform.position - transform.position).normalized;
  48.         float direction = Vector3.Dot(dir, transform.forward);
  49.  
  50.         // 若果已经锁定了的目标不再符合锁定的条件,就应该要解锁了
  51.         if (targetDistance > DistanceLock || direction <= AimDirection) {
  52.                 Unlock();
  53.         }
  54. }
  55.  
  56. void Unlock() {
  57.         // 保存解锁的时间
  58.         timeToLockCount = Time.time;
  59.         target = null;
  60. }

回复 "Unity3d中寻找并锁定对象"

这儿你可以回复上面这条便签

captcha