С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,201

Механическая головоломка

17.12.2025, 19:18. Показов 693. Ответов 6

Студворк — интернет-сервис помощи студентам
Други, к примеру есть три кольца. внешнее и пара внутренних. каждое по отдельности будет вращаться на определенный угол.
На каждом из них будет какой-то объект - символ. когда они сойдутся - задача решена.

каким образом опытный программист (я себя таковым пока не считаю. только учусь ) сохранит решенный вариант и будет сравнивать с текущим после каждого поворота колец? я конечно могу костыльнуть с помощью триггеров или рейкаста, но интересно как можно решить это "изящно". например используя состояния (states) головоломки, или что - то еще по круче...

Добавлено через 1 минуту
примеры кода приветствуются ну прям о-о-о-чень! )))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2025, 19:18
Ответы с готовыми решениями:

Как создать подсказку в головоломке?
Всем доброго времени суток) очень нужна ваша помощь! Делаю игру на подобии "О счастливчик"....

Полная механическая энергия спутника
Искусственный спутник летает вокруг Земли по круговой орбите. Если на очень большом расстоянии от...

стационарная линейная механическая система с одной степенью свободы
Добрый вечер. С дифурами столкнулся впервые и сразу с задачами из учебника Синицына "Фильтры...

6
1142 / 307 / 159
Регистрация: 30.07.2022
Сообщений: 1,779
Записей в блоге: 4
17.12.2025, 21:00
Лучший ответ Сообщение было отмечено Gammister как решение

Решение

Gammister,
пара уточнений:
дверь как в скайриме?


если на всех кругах углы между символами одинаковы, и символы всегда в одном порядке.

в крипте вращаете круги при помощи метода встроенного в юнити
public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);
тыкая в круги мышкой OnMouseDown или RaicastHit


Каждое кольцо можно представить как объект с ключевыми свойствами:
Текущий угол поворота
C#
1
2
3
4
public class Ring
{
    public float currentAngle; // угол вдоль оси вращения
}

"Решенный" вариант — это комбинация углов поворота колец, при которой символы совпадают. Можно сохранить эту комбинацию в отдельной структуре, например:
C#
1
2
3
4
public class SolvedState
{
    public float[] ringAngles; // массив углов для каждого кольца. разумеется нас интересуют только углы вдоль оси вращения
}
После каждого поворота кольца нужно проверять, совпадает ли текущее состояние с "решенным". Для этого можно:
Хранить текущие углы колец в массиве.
Сравнивать их с углами из SolvedState.
C#
1
2
3
4
5
6
7
8
9
10
11
12
public bool IsSolved(Ring[] rings, SolvedState solvedState)
{
    for (int i = 0; i < rings.Length; i++)
    {
        // Проверяем, совпадает ли текущий угол кольца с углом из "решенного" состояния
        if (Math.Abs(rings[i].currentAngle - solvedState.ringAngles[i]) > 0.1f) // 0.1f — погрешность
        {
            return false;
        }
    }
    return true;
}
в итоге что то типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class RingPuzzle : MonoBehaviour
{
    public Ring[] rings; // массив колец - пихаем сюда   все кольца
    public SolvedState solvedState; // сохраненное "решенное" состояние - правильные углы
 
    void Update()
    {
        // Пример: поворот кольца по нажатию клавиши (ОДНОГО КОЛЬЦА)
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rings[0].currentAngle += 30f; // поворачиваем первое кольцо на 30 градусов (НЕ ПЛАВНО)
            if (IsSolved(rings, solvedState))
            {
                Debug.Log("Задача решена!");
            }
        }
    }
 
    bool IsSolved(Ring[] rings, SolvedState solvedState)
    {
        for (int i = 0; i < rings.Length; i++)
        {
            // Проверяем, совпадает ли текущий угол кольца с углом из "решенного" состояния
            if (Math.Abs(rings[i].currentAngle - solvedState.ringAngles[i]) > 0.1f) // 0.1f — погрешность
            {
                return false;
            }
        }
        return true;
    }
}
1
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,201
19.12.2025, 16:16  [ТС]
Цитата Сообщение от ieretsumi Посмотреть сообщение
дверь как в скайриме?
Да, да. все верно. типа скайиримоской головоломки. огромное спасибо ieretsumi !!!
а я вот еще обмысливаю вариант с триггером. вход в триггер прибавляет int на 1, а выход отнимает. и если все три объекта зашли в этот вытянутый (что бы все три объекта влазили в него, если совпадение нужно по одной линии) триггер, то проверяем поле на тройку и вуаля! механику поворота опускаем. и триггеры можно ставить в замысловатые сочетания, меняя задачу головоломок в разных вариациях. без массивов и углов поворота.
как думаете? такой вариант похоже проще, и позволяем модифицировать головоломки без вмешательство в код. но надежен ли?..
0
1142 / 307 / 159
Регистрация: 30.07.2022
Сообщений: 1,779
Записей в блоге: 4
28.12.2025, 15:07
Цитата Сообщение от Gammister Посмотреть сообщение
но надежен ли?
ну смотрите:
Мой подход в том виде, в котором я его реализовал, будет работать, даже если на сцене всё сломается и останется только пустышка с её трансформом и моим скриптом.

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


PS: я заметил, что вы часто используете аналоговый подход в решениях задачи. То есть пытаетесь перенести законы реального мира в виртуальный. Это не правильно.

Вам надо оцифровать решение!!! Лишь эмитировать состояния, а не реализовывать их. Сравнить углы, пусть и в массиве, гораздо легче, чем реализовывать куче столкновений, коллайдеров и триггеров, напрягая железо физическим движком.
И игрока кривой физикой.

Такая разница подходов затрудняет ваше понимание процессов и ломает (в некоторых местах) погружение в игру.
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,201
29.12.2025, 18:36  [ТС]
в принципе в большинстве согласен. спасибо !

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

стоит ли внедрять такие штуки как интерфейсы? что бы реализовать метод Move в элементах таких задачек не задумываясь, что там будет происходить? поворот или перемещение...
то есть, если задуматься об общем подходе, то какой паттерн тут уместен? или комбинация подходов. и уместна ли тут архитектура, как таковая вообще?
заранее благодарю!

Добавлено через 1 час 32 минуты
механики игры, это ведь низкоуровневый слой? с какого момента нужно увязывать в некую структуру или архитектуру?
0
1142 / 307 / 159
Регистрация: 30.07.2022
Сообщений: 1,779
Записей в блоге: 4
29.12.2025, 22:23
Цитата Сообщение от Gammister Посмотреть сообщение
или комбинация подходов
Комбинировать разные подходы, это скорее необходимость, чем допущение.
Например я часто комбинирую ООП и Композицию, принципы SOLID, разные паттерны. Тут главное не следовать только паттернам, это может испортить проект.
подробнее это рассматривает блогер Яковлев Илья

Да и в принципе погуглите "Архитектура кода". Это нереально огромная тема. Тут всего не раскажешь.
1
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,201
30.12.2025, 13:16  [ТС]
Цитата Сообщение от ieretsumi Посмотреть сообщение
подробнее это рассматривает блогер Яковлев Илья
Яковлева смотрю и подобные видео уже несколько месяцев. каждый ролик по отдельности вроде бы понятен, но все это в общую картину никак не складывается. такое чувство, что что-то недоговаривают по тому, как это все должно уживаться в рамках проекта.

что такое слои (верхние, средние, нижние и т.д)? и где находятся их "границы"? как их разделять?
например...

можно ли считать скрипты, не наследующие монобех и не участвующие непосредственно в механиках отдельным слоем?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.12.2025, 13:16
Помогаю со студенческими работами здесь

Механическая поломка принтера - мигают все индикаторы и горит индикатор отсутствия бумаги
Спасайте ребята . У меня картриджи бьются о стены сильно . Прикрепляю Вам к письму скрины на...

Что такой механическая сиситема
Здравствуйте, подсткажите пожалуйста, под выражением механическая сиситема что понемается? ...

Механическая блокировка usb flash от записи
В общем есть флешка для работы Win pe, Программы и все такое. Нужно заблокировать ее механически...

POV - Persistence Of Vision - механическая развёртка
Сабж: http://voltsomdbytes.com/tinypov-yet-an ... v-project/ Спаял, прошил, вроде всё работает как...

Механическая модель молекулы, состоящей из грузиков и пружин
Помогите, пожалуйста, решить задачу: Молекула состоит из 3-х одинаковых атомов, расположенных в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru