[C#] 用于导弹之类的发射,自动寻找目标 →→→→→进入此内容的聊天室

来自 , 2019-05-14, 写在 C#, 查看 117 次.
URL http://www.code666.cn/view/ed277964
  1. // 这段代码用于导弹之类的发射,自动寻找目标等等
  2.  
  3. public Vector3 Noise = new Vector3 (20, 20, 20);
  4. public float Damping = 3;
  5. public float TargetLockDirection = 0.5f;
  6. public int DistanceLock = 70;
  7. public int DurationLock = 40;
  8.  
  9. private bool locked;
  10.  
  11. private void FixedUpdate() {
  12.  
  13.         // 给物体一个速度向量(去掉重力)
  14.         rigidbody.velocity = new Vector3(transform.forward.x * Speed * Time.fixedDeltaTime, transform.forward.y * Speed * Time.fixedDeltaTime, transform.forward.z * Speed * Time.fixedDeltaTime);
  15.         rigidbody.velcoity += new Vector3 (Random.Range (-Noise.x, Noise.x), Random.Range (-Noise.y, Noise.y), Random.Range (-Noise.z, Noise.z));
  16.  
  17.         // 若不给予一个速度,则物体将会匀速运动
  18.         if (Speed < SpeedMax) {
  19.                 Speed += SpeedMult * Time.fixedDeltaTime;
  20.         }
  21. }
  22.  
  23. // 在Update里,所要做的是1.寻找并锁定目标 2.旋转角色,使得其向着目标前进
  24. private void Update() {
  25.  
  26.         if (Target) {
  27.                 // 获取目标与角色之间的角度差,以四元数的形式返回
  28.                 // 这里是使角色的z轴正方向对着目标
  29.                 Quaternion rotation = Quaternion.LookRation(Target.transform.position - transform.transform.position);
  30.                 // 平滑地转向目标
  31.                 transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Damping);
  32.                 // 计算目标与角色之间的余弦值,判断目标是否仍在范围内
  33.                 Vector3 dir = (Target.transform.position - transform.position).normalized;
  34.                 float direction = Vector3.Dot (dir, transform.forward);
  35.                 // 不在范围内就重置目标
  36.                 if (direction < TargetLockDirection) {
  37.                         Target = null;
  38.                 }
  39.         }
  40.  
  41.         // 是否启动锁定器?
  42.         if (Seeker) {
  43.                 // 延迟锁定的时间
  44.                 if (timeToLock > DurationLock) {
  45.                         // 没有锁定并且没有找到目标
  46.                         if (!locked && !Target) {
  47.                                 float distance = int.MaxValue;
  48.                                 // 遍历所有目标对象
  49.                                 for (int t = 0; t < TargetTag.Length; t++) {
  50.                                         if (GameObject.FindGameObjectsWithTag(TargetTag[t].Length > 0)) {
  51.                                                 GameObject[] objs = GameObject.FindGameObjectsWithTag(TargetTag[t]);
  52.  
  53.                                                 for (int i = 0; i < objs.Length; i++) {
  54.                                                         if (objs[i]) {
  55.                                                                 // 这两段代码的作用是用于计算对象与角色之间夹角的余弦值,再根据余弦值来判断对象是否在目标范围内
  56.                                                                 // 这里应用到的数学知识是两个向量a,b的点乘相当于a,b的模相乘,再与它们之间的余弦值相乘。
  57.                                                                 // 先求出对象与角色之间的方向向量,再单位化,则它的模就为1了
  58.                                                                 // transform.forward相对于角色前进方向(z轴)的方向向量,它的模是1
  59.                                                                 // 因此变量direction就是它们两个方向向量的余弦值了。
  60.                                                                 Vector3 dir = (objs[i].transform.position - transform.position.normalized);
  61.                                                                 float direction = Vector3.Dot(dir, transform.forward);
  62.  
  63.                                                                 // 求得两个对象之间的距离
  64.                                                                 float dis = Vector3.Distance(objs[i].transform.position, transform.position);
  65.                                                                 // 若果对象在目标范围之内, 记得direction是余弦值,
  66.                                                                 if (direction >= TargetLockDirection) {
  67.                                                                         // 若果对象在目标距离之内
  68.                                                                         if (DistanceLock > dis) {
  69.                                                                                 // 选择距离最近的
  70.                                                                                 if (distance > dis) {
  71.                                                                                         distance = dis;
  72.                                                                                         Target = objs[i];
  73.                                                                                 }
  74.                                                                                 locked = true;
  75.                                                                         }
  76.                                                                 }
  77.                                                         }
  78.                                                 }
  79.                                         }
  80.                                 }
  81.                         }
  82.                 } else {
  83.                         timeToLock += 1;
  84.                 }
  85.  
  86.                 if (Target) {
  87.  
  88.                 } else {
  89.                         locked = false;
  90.                 }
  91.  
  92.         }
  93. }

回复 "用于导弹之类的发射,自动寻找目标"

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

captcha