Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [Header("Слой/слои пола")]
- public LayerMask layer_floor;
- private Vector3 MoveTo(Ray _ray)
- {
- bool toUp = _ray.direction.y > 0f ? true : false; // вверх или вниз?
- RaycastHit[] rhs = Physics.RaycastAll(_ray, 100f, layer_floor); // рейкастим насквозь
- int min1 = 0; // индекс ближайшего
- int min2 = -1; // индекс следующего после ближайшего
- if (rhs.Length > 1) // если больше одного попадания - ищем очередность...
- {
- for (int i = 1; i < rhs.Length; i++)
- {
- if (rhs[i].distance < rhs[min1].distance)
- {
- min1 = i;
- }
- else
- {
- if (min2 != -1)
- {
- if (rhs[i].distance < rhs[min2].distance)
- min2 = i;
- }
- else min2 = i;
- }
- }
- } else // ...иначе очередность не нужна
- {
- min1 = 0;
- min2 = 0;
- }
- switch (toUp)
- {
- case (true): // если вверх, то надо поднять точку над полом
- {
- Collider col = rhs[min1].collider; // коллайдер
- Renderer rend = col.gameObject.GetComponent<Renderer>(); // рендер коллайдера
- float height = rend.bounds.size.y + 0.01f; // высота пола + чуть-чуть
- Vector3 v = rhs[min1].point; // точка коллизии
- v.y += height; // поднимаем на высоту
- Ray ray = new Ray(v, Vector3.down); // луч вниз для поиска верхней грани
- RaycastHit rh; // ага-ага
- Physics.Raycast(ray, out rh); // рейкастим, проверять не надо, ведь мы ТОЧНО над коллайдером
- print("To up:" + rh.collider.name); // дебаг ))
- return rh.point; // отдаём точку
- }
- case (false): // если вниз, то просто отдаём вторую точку
- {
- print("To down:" + rhs[min2].collider.name); // дебаг ))
- return rhs[min2].point; // отдаём точку
- }
- }
- return Vector3.zero;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement