AmbushedRaccoon

Паркур и Unity - часть 1: GetParkourObstacle

May 31st, 2020
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.77 KB | None | 0 0
  1. //Метода получает на выход gameObject, который мы хотим конвертировать
  2. //В класс ParkourObstacle, который рассмотри далее
  3. private ParkourObstacle GetParkourObstacle(GameObject gameObject)
  4. {
  5.     //Получаем доступ к BoxCollider-у переданного объекта
  6.     BoxCollider collider = gameObject.GetComponent<BoxCollider>();
  7.     //Массив на 8 точек-углов
  8.     var points = new Vector3[8];
  9.     //Прихраним для удобства размеры коллайдера по всем осям координат
  10.     float xSize = collider.size.x;
  11.     float ySize = collider.size.y;
  12.     float zSize = collider.size.z;
  13.     //Запоминаем позицию центра коллайдера, относительно объекта-препятствия
  14.     //В большинстве случаев она будет равна Vector3.zero
  15.     Vector3 center = collider.center;
  16.    
  17.     //Далее получаем все углы. Вычисляем локальную координату угла коллайдера
  18.     //А затем с помощью функции TransformPoint преобразуем её в мировую систему координаты
  19.     //Дабы не сбиться я расставлял плюсы и минусы ориентируясь на двоичное представление индекса в массиве
  20.     //Где 0 это плюс, а 1 это минус
  21.     //Можно было бы выполнить это всё циклом, но не думаю, что такой код был бы сильно короче или более читаемым
  22.     points[0] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y + ySize / 2, center.z + zSize / 2));
  23.     points[1] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y + ySize / 2, center.z + zSize / 2));
  24.     points[2] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y - ySize / 2, center.z + zSize / 2));
  25.     points[3] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y - ySize / 2, center.z + zSize / 2));
  26.     points[4] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y + ySize / 2, center.z - zSize / 2));
  27.     points[5] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y + ySize / 2, center.z - zSize / 2));
  28.     points[6] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y - ySize / 2, center.z - zSize / 2));
  29.     points[7] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y - ySize / 2, center.z - zSize / 2));
  30.  
  31.     //Далее я эмпирическим методом определил, какие точки относятся к каким граням
  32.     //Wall0 - 0, 1, 2, 3
  33.     //Wall1 - 0, 2, 4, 6
  34.     //Wall2 - 4, 5, 6, 7
  35.     //Wall3 - 1, 3, 5, 7
  36.     //Floor - 0, 1, 4, 5
  37.  
  38.     //Создаём объект ParkourObstacle, входными параметрами для конструктора которого,
  39.     //Будут верхняя грань, массив стен, и коллайдер.
  40.     return new ParkourObstacle(new ParkourObstacle.Wall(points[0], points[1], points[4], points[5]),
  41.         new ParkourObstacle.Wall[]
  42.         {
  43.             new ParkourObstacle.Wall(points[0], points[1], points[2], points[3]),
  44.             new ParkourObstacle.Wall(points[0], points[2], points[4], points[5]),
  45.             new ParkourObstacle.Wall(points[4], points[5], points[6], points[7]),
  46.             new ParkourObstacle.Wall(points[1], points[3], points[5], points[7]),
  47.         },
  48.         collider);
  49. }
Add Comment
Please, Sign In to add comment