Вызов гуя, есть проблемы.
Короче есть у меня скрипт, который следит за тем чтобы гуй был вкл или выкл.
По клику мыши на монстра, меняется переменная в глобальном скрипте, и другой скрипт включает отображение гуя на канвасе. При повторном щелчке мыши где угодно у меня вызывается переменная, которая выключает отображения гуя через тот же скрипт. Скрипт отслеживающий щелчки по монстру, скрипт с глобальными переменными статическими, и вызывающий гуй скрипт - разные. Всё работает до тех пор, пока я не собираюсь при вызванном гуе с монстра щёлкнуть мышкой в другого монстра, и тут в 30% случаев сначала вызывается гуй, потом сразу скрывается из-за скрипта в предыдущем монстре (скрипта, который после отображения скрывает гуй по щелчку). Выглядит как баг, и не приятно. Посоветуйте как лучше организовать процесс, может у кого есть идеи? Отображение и скрытие должны происходить на одну и ту же клавишу, и то действие должно быть применимо к любому количеству пропикиваемых лучом монстров. Я чё-то по ходу на работе заработался, что сейчас вечерами не могу решить такую простую элементарную задачу. А теперь снова всё то же самое: К щелчку по монстру привязано отображение гуя, когда гуй отображён, при любом следующем щелчке срабатывает скрипт скрывающий гуй. Проблема случается в тот момент, когда уже при отображённом гуе вызванном на одном монстре, мне вдруг нужно щёлкнуть в другого монстра и вызвать тот же гуй. В 30% случаев, сначала срабатывает вызов гуя на новом монстре, и после на предыдущем монстре тот же самый клик мне всё руинит закрывая гуй. Я знаю, что можно сделать, чтобы только по клику на монстра или на кнопку гуй закрывался, и после типа мы только получали возможность тыкать в другого монстра, но мне это не подходит, т.к. это медленный вариант раздражающий игрока, всё должно делаться быстро, и по клику на одну и ту же клавишу. Вопрос в том, как дать понять скрипту, что раз мы уже на другом монстре гуй вызвали, то на прерыдущем его по щелчку скрывать не надо. Вроде всё элементарно, тупо, просто. Но это юнити, и он мне что-то мозг сломал, со своей разбивкой на миллион префабов, и скриптов обрабатываемых в рандомном порядке. Если бы хотя бы какая-то структура обработки скриптов была на вызванных префабах, а он рандомом хреначит без последовательности чёткой. |
Ответ: Вызов гуя, есть проблемы.
Я бы не открывал гуй с скрипта на монстре, а открывал гуй тем скриптом, которым ты его скрываешь. Пусть этот скрипт палит где ты кликнул, если - монстр - открой гуй монстра, если другое место - скрыть гуй. Ну и соответственно клик на другом монстре обновит открытый гуй.
PS: еще есть конечно фича явного указания порядка обработки скриптов Script Execution Order, но это только в экстремальных случаях) |
Ответ: Вызов гуя, есть проблемы.
Цитата:
отрабатывают пики лучём и щелчки клавишами, результат отработки идёт в переменные глобального скрипта, а вот за ними следит скрипт который скрыванием и отображением гуя занимается, этот скрипт к префабу юнита не привязан, он привязан к независимому объекту на сцене. Представьте стратегию, где куча одинаковых юнитов-префабов, вот они спавнятся, у них у всех один и тот же скрипт, который следит за клацаниями мышки, и за лучом. Проблема грубо говоря в том, что я мышкой юнитов выделяю, одновременно может быть выделен только один, и вот когда у меня уже есть выделенный юнит, и я хочу выделить другого не сбросив выделения с первого, то по логике скрипта когда я навёл на нового юнита луч и клацнул мышью, в него полетел луч, что привело к выделению юнита в последствии, но к этой же самой клавише мышки в скрипте привязано снятие выделения с юнита, по тому, что мне так надо. Так вот значит у меня уже один выделенный, я хочу вместо него выделить другого не сбрасывая предварительно выделения у первого, оно должно само сброситься при выделении нового, стреляю в нового лучом, он выделяется, появляется гуй, но перед этим у старого юнита должно произойти снятие выделения, и гуй должен исчезнуть, чтобы у нового он появился, и это работает в 70% случаев, но в 30% порядок меняется, случайно, просто юнити решает, а давай ка я сначала займусь обработкой скрипта вон того юнита, а не этого, и хопа у меня баг, я на новом юните вместо отображения гуя получаю его скрытие, по тому что старый юнит кинул переменную закрытия в следящий за этим делом скрипт. Блин, я надеюсь доходчиво процесс описываю, мне то понятно что я пишу, но понятно ли вам неизвестно )) Короче, я никогда не сталкивался с такими проблемами в блитце, а ведь у меня есть на нём прототип RTS, но тут же с этими префабами, и непонятно как обрабатываемыми скриптами я проблему победить пока не могу. Я просто не могу задать порядок выполнения процессов в одинаковых скриптах одинаковых префабах в нужной последовательности при определённых обстоятельствах. Рано или поздно я это сделаю, правда даже не представляю что за монстра мне придётся породить, это будет что-то наверное работающее через задницу. В блитце канваса нет, с любой функции можно прям на экран рисовать что хочешь, с любого копированного типа, а в юньке я привязан к панели на канвасе, который висит в инспекторе, и ссылку на него в скрипт префаба не перетянуть из-за механики интерфейса юнити. Вот мне и приходится как-то раком через жопу через глобальные переменные и отдельный скрипт вылавливать статус состояния гуя, для его отрисовки, по тому что юнитивский гуй общий для всех юнитов, ибо для экономии ресурсов я не могу на каждого юнита создавать отдельный канвас, я говнодел но не на столько. Добавлю: скрытие гуя реализовано так, что оно может произойти только на втором прогоне скрипта после выделения юнита, и прописано оно раньше, чем область кода отвечающая за отображение гуя. По идее, раз скрипт у всех юнитов одинаковый, и они одинаково отслеживают нажатия клавиши, то при одновременном срабатывании скрипта везде, сначала по порядку должно произойти скрытие гуя на старом юните, а после открытие на новом. Но как я теперь понимаю, юнити обрабатывает одинаковый скрипт на каждом префабе по очереди, а не одновременно, и очерёдность обработки он выбирает сам по рандому, по воле аллаха. Если бы мне удалось задать очерёдность обработки скриптов, понижать и повышать статус важности выполнения, тогда бы юнити делал то, что мне нужно. Подчёркиваю, очерёдность обработки одного и того же скрипта на одинаковых префабах. Можно поставить таймер на отображение гуя в пол секунды, но игрока будет раздражать, это не решение. |
Ответ: Вызов гуя, есть проблемы.
Проблему решил за счёт нагрузки движка лишней прокруткой скрипта.
В общем сделал так, что при первом нажатии скрипт запоминает это действие, прокручивается без вызова гуя, и после он 1 раз уже сам себя прогоняет без кликания мышки и вызывает гуй. При этом функция скрытия гуя выполняется сразу в первую прокрутку скрипта. (а ведь скрытие у нас по условию [не каждый цикл скрипта]) Так-как юнити выбирает у префабов скрипты рандомно, но с условием, что он не прокрутит скрипт ещё раз, пока не прокрутит все остальные по разу, а вызов гуя у нас происходит только на вторую самозапускаемую прокрутку, то сто процентов скрипт сначала везде по убирает гуй, потом самозапустится и гуй вызовет. Всё работает. Сразу по ходу это породило баг, сделавший невозможным скрытие гуя по клику на уже выделенного монстра, но я эту проблему решил добавлением ещё одной переменной, и отслеживанием оной. |
Ответ: Вызов гуя, есть проблемы.
Механика такова:
Код:
private int ProgonScripta = 0; |
Ответ: Вызов гуя, есть проблемы.
Как это часто бывает, решение одной проблемы может породить другую,
теперь я не могу перемещать юнитов, и знаю почему, лол, ну это я уже решу )) |
Ответ: Вызов гуя, есть проблемы.
Так не интересно, уже решил :(
|
Ответ: Вызов гуя, есть проблемы.
Билд этого всего тут: ТЫК
Мышкой бежим к монстру, выбираем режим "сражаться". В сцене боя пока все юниты подконтрольны игроку, можно наспавнить ещё сколько хочешь. Ну и вот там по тыкайте по выделяйте, по сбрасывайте выделение, всё должно работать. |
Ответ: Вызов гуя, есть проблемы.
Сорян, что с запозданием, я вижу примерно такой алгоритм работы (пишу прям в браузере, могут быть ошибки):
PHP код:
PHP код:
PHP код:
|
Ответ: Вызов гуя, есть проблемы.
Привет Пакс, спасибо за труд, но это ты зря, я же за теорией только пришёл с конкретной проблемой )
(может в будущем мне понадобится подсмотреть твоё решение, если споткнусь об очередную граблю) У меня сейчас всё работает как надо, а пример того, как оно работает я выше описал. (без конкретных участков как мы луч пускаем, и тд). Оно всё так или иначе близко к тому, что ты накодил здесь, я просто не стал сюда код выкладывать, т.к. он делает ещё много всего помимо включения интерфейса. Там ещё всякие условия есть, не нашла ли мышь на интерфейс, не сделали ли мы там чё-то ещё. Однако я считаю твоя работа может быть кому-то полезной, и это хорошо, контент на форуме. Стиль у нас конечно кодинга на разном уровне, у меня всё ещё говнокодинг лютый, а у тебя по симпатичнее ) Если будет интересно, как это работает у меня, код скину, правда комментариев мало, и есть не удалённый мусор. ---- Ты кстати свой код не испытывал ещё в реалиях? Может тот же баг со скрытием интерфейса вылезет ) Условие : один юнит уже выделен, нам надо выделить другого в 1 клик. У меня в действительности до моего решения баг вылезал не сразу, а где-то на шестом\седьмом юните. Так что это ещё наспавнить надо кучу, и прокликивать, чтобы выловить. |
Ответ: Вызов гуя, есть проблемы.
Цитата:
Тестировать не тестировал, прям в браузере писал. Но багов не должно быть, тут все однозначно. |
Ответ: Вызов гуя, есть проблемы.
Щас покажу панковский метод:
Скрипт отвечающий и за выделение монстра, и за построение\удаление сетки полигонов меша внутри ассета, с учётом массива проходимости ячеек: [предупреждаю - есть мусор, оставленный от предыдущих версий, и тестов - на езду не влияет ))] Код:
using System.Collections; Код:
using System.Collections; Код:
using System.Collections; однако этот код исправно функционирует, и довольно быстро ) |
Ответ: Вызов гуя, есть проблемы.
Много сложного кода :) . Но судя по последнему небольшому скрипту (SkillPanelSkrivator), он мониторит переменные и делает что-то на их основе.
Проблема может быть в том, что ты в блоках if не завершаешь логику (не делаешь return). Т.е. у тебя каждый Update всегда проверяются все три блока if. Ну и в дополнение - избавляйся от магических чисел, используй энамы или константы. |
Ответ: Вызов гуя, есть проблемы.
Цитата:
|
Ответ: Вызов гуя, есть проблемы.
Цитата:
Когда апдейт докручивает до определённого if, он внутри скобок проверяет условие, в каком состоянии находится интересующая нас переменная, и при удовлетворительном результате запускает весь код в фигурных скобках. Цитата:
Фраза защищающая от рукожопых исследователей ) |
Часовой пояс GMT +4, время: 10:22. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot