Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Метода получает на выход gameObject, который мы хотим конвертировать
- //В класс ParkourObstacle, который рассмотри далее
- private ParkourObstacle GetParkourObstacle(GameObject gameObject)
- {
- //Получаем доступ к BoxCollider-у переданного объекта
- BoxCollider collider = gameObject.GetComponent<BoxCollider>();
- //Массив на 8 точек-углов
- var points = new Vector3[8];
- //Прихраним для удобства размеры коллайдера по всем осям координат
- float xSize = collider.size.x;
- float ySize = collider.size.y;
- float zSize = collider.size.z;
- //Запоминаем позицию центра коллайдера, относительно объекта-препятствия
- //В большинстве случаев она будет равна Vector3.zero
- Vector3 center = collider.center;
- //Далее получаем все углы. Вычисляем локальную координату угла коллайдера
- //А затем с помощью функции TransformPoint преобразуем её в мировую систему координаты
- //Дабы не сбиться я расставлял плюсы и минусы ориентируясь на двоичное представление индекса в массиве
- //Где 0 это плюс, а 1 это минус
- //Можно было бы выполнить это всё циклом, но не думаю, что такой код был бы сильно короче или более читаемым
- points[0] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y + ySize / 2, center.z + zSize / 2));
- points[1] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y + ySize / 2, center.z + zSize / 2));
- points[2] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y - ySize / 2, center.z + zSize / 2));
- points[3] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y - ySize / 2, center.z + zSize / 2));
- points[4] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y + ySize / 2, center.z - zSize / 2));
- points[5] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y + ySize / 2, center.z - zSize / 2));
- points[6] = gameObject.transform.TransformPoint(new Vector3(center.x + xSize / 2, center.y - ySize / 2, center.z - zSize / 2));
- points[7] = gameObject.transform.TransformPoint(new Vector3(center.x - xSize / 2, center.y - ySize / 2, center.z - zSize / 2));
- //Далее я эмпирическим методом определил, какие точки относятся к каким граням
- //Wall0 - 0, 1, 2, 3
- //Wall1 - 0, 2, 4, 6
- //Wall2 - 4, 5, 6, 7
- //Wall3 - 1, 3, 5, 7
- //Floor - 0, 1, 4, 5
- //Создаём объект ParkourObstacle, входными параметрами для конструктора которого,
- //Будут верхняя грань, массив стен, и коллайдер.
- return new ParkourObstacle(new ParkourObstacle.Wall(points[0], points[1], points[4], points[5]),
- new ParkourObstacle.Wall[]
- {
- new ParkourObstacle.Wall(points[0], points[1], points[2], points[3]),
- new ParkourObstacle.Wall(points[0], points[2], points[4], points[5]),
- new ParkourObstacle.Wall(points[4], points[5], points[6], points[7]),
- new ParkourObstacle.Wall(points[1], points[3], points[5], points[7]),
- },
- collider);
- }
Add Comment
Please, Sign In to add comment