JIT
Создание замкнутого генератора с полной логикой работы
Сделай цикличный (замкнутый) генератор комплекса продумай полную логику от начало и до конца

markdown Мы настроим цикличный генератор комплексов в Unity.

Инструкции по использованию:

  1. Создайте три файла в папке Assets/Scripts: ConnectionPoint.cs, Complex.cs и CyclicComplexGenerator.cs, скопировав в них соответствующий код.
  2. Создайте несколько префабов для ваших "комплексов" (например, коридор, комната).
  3. Для каждого префаба:
    • Добавьте компонент Complex.cs.
    • Создайте дочерние пустые GameObjects, представляющие точки соединения (например, на концах коридора или у дверных проемов комнаты).
    • В инспекторе компонента Complex добавьте элементы в список Manual Connection Points. Перетащите дочерние GameObjects точек соединения в поле Transform. Укажите Local Direction для каждой точки (например, (0,0,1) для направления "вперед" относительно локальной оси Z точки, (1,0,0) для "вправо" относительно локальной оси X и т.д.). Убедитесь, что направления согласованы между префабами (например, "выход на север" одного префаба должен соединяться с "входом с юга" другого).
  4. Создайте пустой GameObject в сцене и добавьте компонент CyclicComplexGenerator.cs.
  5. Перетащите созданные префабы комплексов в массив Complex Prefabs в инспекторе генератора.
  6. Установите желаемое Number Of Complexes (минимум 2).
  7. Нажмите правой кнопкой мыши на компоненте Cyclic Complex Generator в инспекторе и выберите "Generate Cyclic Complex".

Генератор попытается создать цепочку из numberOfComplexes комплексов, соединяя их последовательно, а затем попытается соединить последний комплекс обратно с первым, чтобы замкнуть петлю.

Важно: Этот базовый генератор не включает проверку на коллизии. Если финальное положение последнего комплекса перекрывает другие, генерация будет визуально некорректной. Для более надежной генерации потребуется добавить логику проверки пересечений или использовать сеточную систему.*

Updated files
v1
а комнаты сами не поворачиваются?

markdown Да, комплексы (комнаты) поворачиваются скриптом CyclicComplexGenerator.

Логика генератора включает расчет необходимого вращения для каждого нового комплекса (и для последнего комплекса при замыкании петли), чтобы его точка входа совпала по направлению с точкой выхода предыдущего комплекса.

Вот соответствующие строки кода, которые выполняют вращение:

  • При соединении комплексов в цепочку: csharp Quaternion rotationNeeded = Quaternion.FromToRotation(entrancePoint.WorldDirection, -exitPoint.WorldDirection); newComplexGO.transform.rotation = rotationNeeded * newComplexGO.transform.rotation;

    Эта часть вычисляет вращение, необходимое для того, чтобы мировое направление точки входа нового комплекса стало противоположным мировому направлению точки выхода предыдущего комплекса, и применяет это вращение к новому комплексу.

  • При замыкании петли (соединение последнего с первым):

    Quaternion finalRotationNeeded = Quaternion.FromToRotation(finalExitPoint.WorldDirection, -finalEntrancePoint.WorldDirection);
    lastComplex.transform.rotation = finalRotationNeeded * lastComplex.transform.rotation;
    

    Эта часть вычисляет вращение, необходимое для того, чтобы мировое направление финальной точки выхода последнего комплекса стало противоположным мировому направлению финальной точки входа первого комплекса, и применяет это вращение к последнему комплексу.

Таким образом, скрипт активно управляет вращением комплексов для обеспечения правильного соединения их точек.

Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,17): error CS1519: Invalid token '&' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(49,35): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\Complex.cs(49,65): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\Complex.cs(49,65): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,20): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(70,35): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,28): error CS1519: Invalid token '&' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(70,65): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\Complex.cs(70,65): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,31): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,52): error CS1519: Invalid token '=' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(84,54): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\Complex.cs(84,59): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\Complex.cs(84,59): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,62): error CS1519: Invalid token '&' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(115,42): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,65): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(115,75): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\Complex.cs(115,75): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,73): error CS1519: Invalid token '&' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(120,50): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\Complex.cs(120,69): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,76): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\Complex.cs(120,69): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,78): error CS8124: Tuple must contain at least two elements. Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(16,79): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(30,34): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(30,37): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(30,37): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(38,75): error CS1525: Invalid expression term ')' Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(50,53): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(50,58): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(50,58): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(69,32): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(69,45): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(69,45): error CS1513: } expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(73,97): error CS1525: Invalid expression term ')' Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(190,37): error CS1026: ) expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(190,70): error CS1002: ; expected Assets\__LZC__\Scripts\Scripts\CyclicComplexGenerator.cs(190,70): error CS1513: } expected

markdown Понял. Ошибки компиляции вызваны тем, что некоторые символы в коде (например, < и &) были преобразованы в HTML-сущности (&lt; и &amp;). Это часто происходит при копировании кода из определенных форматов.

Я предоставлю исправленный код для обоих файлов, заменив HTML-сущности на правильные символы C#.

Пожалуйста, замените содержимое ваших файлов Complex.cs и CyclicComplexGenerator.cs на код выше. Это должно устранить ошибки компиляции.

Updated files
v2
'ConnectionPoint' is missing the class attribute 'ExtensionOfNativeClass'!

markdown Понял. Ошибка 'ConnectionPoint' is missing the class attribute 'ExtensionOfNativeClass' иногда возникает в Unity при попытке сериализовать структуры, содержащие ссылки на UnityEngine.Object (как Transform). Хотя структуры могут быть сериализованы, использование ссылок внутри них может вызывать проблемы или приводить к таким вводящим в заблуждение ошибкам.

Наиболее надежное решение в таких случаях — преобразовать struct в class. Классы лучше обрабатываются системой сериализации Unity, особенно когда содержат ссылки на объекты сцены.

Давайте изменим ConnectionPoint с struct на class.

Я изменил ConnectionPoint на class и внес небольшие корректировки в Complex и CyclicComplexGenerator для работы с объектами класса вместо структур (в основном, проверки на null и отсутствие необходимости переприсваивать элементы списка при изменении isUsed).

Пожалуйста, обновите файлы ConnectionPoint.cs, Complex.cs и CyclicComplexGenerator.cs этим кодом. Это должно решить проблему с сериализацией и ошибкой ExtensionOfNativeClass.

Updated files
v3
'ConnectionPoint' is missing the class attribute 'ExtensionOfNativeClass'!

markdown Понял, что ошибка 'ConnectionPoint' is missing the class attribute 'ExtensionOfNativeClass' все еще появляется, несмотря на изменение struct на class.

Эта ошибка в Unity обычно указывает на проблему с сериализацией пользовательского класса (ConnectionPoint), который содержит ссылки на объекты Unity (Transform), когда этот класс не является MonoBehaviour или ScriptableObject. Преобразование в class и добавление [System.Serializable] должно решить эту проблему в большинстве случаев, так как это стандартный способ сериализации таких данных.

Поскольку ошибка сохраняется, это может быть связано с состоянием редактора Unity или другими факторами в вашем проекте.

Вот несколько шагов, которые часто помогают в таких ситуациях:

  1. Перезапустите Unity: Это самый простой и часто эффективный способ сбросить внутреннее состояние редактора и кэши.
  2. Переимпортируйте все ассеты: В окне Project (Проект) нажмите правой кнопкой мыши на папке Assets и выберите "Reimport All" (Переимпортировать все). Это заставит Unity перечитать и перекомпилировать все скрипты.
  3. Проверьте путь к файлам: Убедитесь, что файлы ConnectionPoint.cs, Complex.cs и CyclicComplexGenerator.cs находятся в стандартной папке Assets или ее подпапках (например, Assets/Scripts). Размещение скриптов в специальных папках (вроде Editor, Plugins и т.д.) может влиять на их компиляцию и сериализацию.
  4. Проверьте другие скрипты: Хотя это менее вероятно, убедитесь, что нет других скриптов, которые как-то необычно взаимодействуют с классом ConnectionPoint или Complex, что могло бы вызвать проблемы с сериализацией.

Я предоставлю код еще раз. Пожалуйста, убедитесь, что вы полностью заменили содержимое файлов на этот код и попробуйте выполнить шаги по устранению неполадок выше.

Пожалуйста, попробуйте обновить файлы еще раз и выполнить предложенные шаги по устранению неполадок. Если проблема не исчезнет после перезапуска Unity и переимпорта, возможно, потребуется более глубокое изучение специфики вашего проекта или версии Unity.

Updated files
v4