Advertisement
KpoKec

Raycast through floor (floor change)

Aug 24th, 2017
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.65 KB | None | 0 0
  1.     [Header("Слой/слои пола")]
  2.     public LayerMask layer_floor;
  3.  
  4.     private Vector3 MoveTo(Ray _ray)
  5.     {
  6.         bool toUp = _ray.direction.y > 0f ? true : false; // вверх или вниз?
  7.         RaycastHit[] rhs = Physics.RaycastAll(_ray, 100f, layer_floor); // рейкастим насквозь
  8.         int min1 = 0; // индекс ближайшего
  9.         int min2 = -1; // индекс следующего после ближайшего
  10.         if (rhs.Length > 1) // если больше одного попадания - ищем очередность...
  11.         {
  12.             for (int i = 1; i < rhs.Length; i++)
  13.             {
  14.                 if (rhs[i].distance < rhs[min1].distance)
  15.                 {
  16.                     min1 = i;
  17.                 }
  18.                 else
  19.                 {
  20.                     if (min2 != -1)
  21.                     {
  22.                         if (rhs[i].distance < rhs[min2].distance)
  23.                             min2 = i;
  24.                     }
  25.                     else min2 = i;
  26.                 }
  27.             }
  28.         } else // ...иначе очередность не нужна
  29.         {
  30.             min1 = 0;
  31.             min2 = 0;
  32.         }
  33.  
  34.         switch (toUp)
  35.         {
  36.             case (true): // если вверх, то надо поднять точку над полом
  37.                 {
  38.                     Collider col = rhs[min1].collider; // коллайдер
  39.                     Renderer rend = col.gameObject.GetComponent<Renderer>(); // рендер коллайдера
  40.                     float height = rend.bounds.size.y + 0.01f; // высота пола + чуть-чуть
  41.                     Vector3 v = rhs[min1].point; // точка коллизии
  42.                     v.y += height; // поднимаем на высоту
  43.                     Ray ray = new Ray(v, Vector3.down); // луч вниз для поиска верхней грани
  44.                     RaycastHit rh; // ага-ага
  45.                     Physics.Raycast(ray, out rh); // рейкастим, проверять не надо, ведь мы ТОЧНО над коллайдером
  46.                     print("To up:" + rh.collider.name); // дебаг ))
  47.                     return rh.point; // отдаём точку
  48.                 }
  49.             case (false): // если вниз, то просто отдаём вторую точку
  50.                 {
  51.                     print("To down:" + rhs[min2].collider.name); // дебаг ))
  52.                     return rhs[min2].point; // отдаём точку
  53.                 }
  54.         }
  55.         return Vector3.zero;
  56.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement