Как сделать проверку будет ли выполнен метод, и если да, то остановить 1 скрипт, и запустить 2?
У меня есть 2 скрипта, 1-ый работает как основной, и там выполняется определенный код, этот определенный код это спавн объекта, после спавна объекта в том же скрипте сразу же выполняется проверка переменной error, если это true, то объект удаляется, если false, то остаётся. Значение этой переменной приходит уже от 2-го скрипта. 2 скрипт лежит на объектах, которые заспавнил 1-ый скрипт, он служит как обработчик события OnTriggerEnter2D. Как только это событие случается, то есть объект сталкивается, он передает значение переменной error, то есть true, и соответственно 1 скрипт после спавна этого объекта, должен будет его сразу же удалить, но происходит это - выполняется проверка в 1-ом скрипте, и значение переменной error false(по умолчанию), хотя должно быть true. True нету потому что 2-ой скрипт, выполниться ТОЛЬКО после того, как выполниться полностью 1-ый, и вот вопрос, как сделать их работу асинхронным? Я сделал waitforsecond на 1-ом скрипте, и это работает, но здесь у тебя статичное время остановки, что такое себе, так как нужно чтобы скрипт выполнялся без искусственной остановки. То есть нужно чтобы 1-ый скрипт узнал будет ли выполнен OnTriggerEnter2D, если да, то ждать столько времени, пока он не выполниться, а если нет, то соответственно и не ждать. Можно это делать через await, но проблема в том что если этот объект не столкнулся, то метод выполнен не должен будет, а при await он будет выполнен. Как это сделать?
Quark, Напомню как это работает, сначала спавнится объект, после чего происходит функция которая проверяет эту переменную, если она true - удаляет, если false - оставляет, но как раз таки во 2 скрипте меняется ее значение ТОЛЬКО если сработало событие "OnTriggerEnter2D", соответственно 2-ой скрипт срабатывает только если заспавненый объект врезался, а 2-ой скрипт просто так работать не должен. И вот перед тем как запустить функцию проверки этого значение, нужно сделать "Что-то", что будет проверять сработает ли 2-ой скрипт, и если он срабатывает тогда останавливать 1-ый скрипт, и ждать полного завершения 2-ого скрипта, а уже потом запускать функцию проверки. Это можно достичь использовав await waitforsecond, но это искусственная задержка, которая мне не нужна
1-ый работает как основной, и там выполняется определенный код, этот определенный код это спавн объекта,
//Первый скрипт
AllObjects[];
void CreateObject(){
//создаёте ваш объект
AllObjects.add(new Objects);
}
void DeleteObject(object obj){
//удаляете входной объект из массива
AllObjects.delete(obj);
}
//можно реализовать на индексах, чтоб было проще в вычислениях
Значение этой переменной приходит уже от 2-го скрипта. 2 скрипт лежит на объектах, которые заспавнил 1-ый скрипт, он служит как обработчик события OnTriggerEnter2D. Как только это событие случается, то есть объект сталкивается, он передает значение переменной error, то есть true, и соответственно 1 скрипт после спавна этого объекта, должен будет его сразу же удалить
//Второй скрипт
//ссылка на родителя(1 скрипт)
class Parent;
void OnTriggerEnter2D(){
//если сработал, то удалить себя из масива
Parent.DeleteObject(self);
}
Вот вам псевдокод предлагаемого решения
Стоит так же учесть, что происходит проверка коллизии не сразу. Результат о столкновении вы получите минимум в следующем кадре, а не в текущем. И этого никак не избежать, такова структура движка.
Quark, это конечно все хорошо, но вы не учтли одной штуки, которую я и хочу понять. Вопрос именно о том как сделать именно как я сказал, я хочу понять как в принципе это сделать, потому что как я писал выше, сначала полностью должен закончиться 1-ый скрипт, а только потом начинается 2, так как в 1-ом скрипте цикл, и вот мне нужно чтобы на время проверки останавливался 1-ый скрипт, а потом если сработает OnTriggerEnter2D, ждать пока закончится 2 скрипт, а потом возвращается к первому скрипту, в этом суть вопроса, а не в том что вы написали. Если вы сказали про кадр, то возможно сделать задержку на кадр или сколько там надо, и если в течении это времени сработает OnTriggerEnter2D, то ждать пока завершится 2 скрипт. Вот как именно это сделать?
DaNKuL, с этим вам должны помочь корутины, которые вы, по видимо уже используется, однако задержку на время можно заменить на задержку на кадр Корутины.
Однако, если не секрет, для чего именно вам понадобился столь странный функционал?
Quark, просто понять как переключатся между выполнением скриптов. А можете сказать как это сделать на await? Так как там просто так yeild использовать нельзя, ну точнее он будет работать некорректно
Потому что мне надо примерно такую логику: 1 скрипт - спавн объекта, переключение на 2 скрипт, 2 скрипт - проверка на то столкнулся ли объект, и изменение переменной, переключение на 1 скрипт, проверка переменной. Примерно вот так, а если делать вашим способом, то получится вот это: 1 - скрипт, спавн объекта, проверка x(n)(какое то кол-во повторений), переключение на 2 скрипт, 2 - скрипт проверка последнего объекта, возвращение значения переменной. При такой логике проверен будет только последний объект, так как во время проверки значения переменной error, ее значение будет постоянно на false, так как 2 скрипт не выполнялся. Думаю стало понятно
А если делать допустим удаление через 2 скрипт то получается эта проблема: у меня есть переменная, где указано сколько должно быть объектов на сцене, и при удаление объекта через error, у меня происходит 2 попытка спавна объекта, из за чего объектов будет всегда определенное кол-во которое задано, а если вышим, то просто в конце удалятся объекты, и уже объектов будет не такое кол-во, которое надо
Возможно такая штука происходит из за того что переменная меняется методом в 1-ом скрипте через подписку на события во 2-ом скрипте. Но я не очень понимаю как получить переменную класса, не делая при этом экземпляр класса, а если использовать static, то начинаются конфликты, из за того что static должен работать со static
Quark, то есть я так понимаю ваше предложение, это спавнить нужно кол-во объектов, потом удалять тех кто врезался, и потом заного делать цикл, но ведь здесь в любом случае нужно делать задержку, так как 2 скрипт всегда будет выполняться после, а соответственно ты не восстановишь работу 1 скрипта, или я что то не понял?
DaNKuL, Вот пример тебе о чём я говорю:
Допустим 1-скрипт отвечает за стрельбу из лука, который стреляет сразу 3 стрелами. И ты хочешь, чтобы каждая стрела удалялась после того, как чего-то коснётся и при этом в мире не могло бы находиться больше n количества стрел одновременно.
Тогда:
При спавне стрелы вешаешь на неё 2-й скрипт, внутри котого будет функция OnTriggerEnter2D. После того, как стрела чего-то коснётся, функция вызовется и, обратясь с скрипту 1, удалит себя из буфера.
А для ограничения количества стрел в мире просто проверяем размер буффера и не даём игроку стрелять, если он заполнен.