Как скрипты общаются
Мне часто задают вопрос о том, как обратиться из какого-либо скрипта к переменной другого скрипта, или как вызвать метод (функцию) другого скрипта. В этой маленькой статейке я бы хотел описать способы, которые можно для этого использовать.
Публичные переменные и доступ к компонентам Допустим есть у нас такой скрипт PHP код:
Первый вариант подразумевает, что вы создадите публичную PHP код:
Второй вариант подразумевает поиск скрипта у объекта и сохранение ссылки на него. Допустим мы забыли указать скрипт с помощью редактора, но знаем что он должен быть, тогда можно написать код, который его найдет в начале работы скрипта. PHP код:
Третий вариант самый не оптимальный для использования в каждом кадре (Update вызывается каждый кадр). Но зато эффективен для разового использования т.к. нет необходимости в создании переменной-ссылки на нужный нам скрипт. PHP код:
Вызов методов других скриптов Все что описано про публичные переменные относится и к вызову методов. Имеем скрипт: PHP код:
Ну и собственно пример вызова: PHP код:
Сообщения Вызвать метод скрипта объекта можно так же послав сообщение этому объекту (не скрипту). Но данный способ медленнее описанного выше. PHP код:
Ну вот и все что хотел рассказать. Данная статья так же есть на wiki |
Ответ: Как скрипты общаются
Спасибо pax! В очередной раз отлично прояснил ситуацию.
Попутный вопрос в догонку насчет функции\метода SendMessage()... А как обьекту послать помимо сообщения еще и контекст сообщения ? В БМаксе - все просто - SendMessage:Object(message:Object, context:Object) Конечно, можно контекст "впихнуть" в саму мессагу, но хотелось бы как в БлицМаксе =) |
Ответ: Как скрипты общаются
функция SendMessage принимает вторым параметром object, т.е. что угодно. Следовательно можно написать например такой класс
PHP код:
PHP код:
PHP код:
|
Ответ: Как скрипты общаются
Всем привет!
А подскажите как быть, если переменную нужно взять из скрипта другой сцены, т.е. есть сцена со скриптом там переменная bool, мы можем ее менять на true и false, и такоеже значение она должна иметь в другой сцене. Зарание спасибо. |
Ответ: Как скрипты общаются
В скрипте, переменная которого нужна в другой сцене нужно в Start использовать Object.DontDestroyOnLoad . ТОгда объект на котором этот скрипт не удалится при загрузке следующего уровня и скрипт будет доступен.
|
Ответ: Как скрипты общаются
Большое спасибо!
А сам объект отобразится в новой сцене? Он то мне не нужен. И если не тяжело, можно ссылку на мануал с этой функцией. Я так понял ее так вот писать: void Start() {Object.DontDestroyOnLoad;} а потом вызывать одним из описаных методов? |
Ответ: Как скрипты общаются
ссылку не нужно, уже нашел....
|
Ответ: Как скрипты общаются
Извените, а немогли бы краткий пример написать, а то чета не могу понять, а в справке всего один пример?
|
Ответ: Как скрипты общаются
Переменные, к которым вы обращаетесь в разных сценах лучше хранить на каком нибуть донт дестрой обьекте. У вас этот обьект будет просто перемещаться между сценами и к переменным всегда будет доступ.
|
Ответ: Как скрипты общаются
Пробавал как-так, ScriptName это имя скрипта на объекте
void Start() { ScriptName other; other = gameObject.GetComponent("ScriptName") as ScriptName; other.DontDestroyOnLoad() } |
Ответ: Как скрипты общаются
PHP код:
|
Ответ: Как скрипты общаются
Всем спасибо, разобрался, теперь тока одна проблема : когда в сцене меняю значение bool переменной, все работает как нужно, перехожу в след. сцену моя переменная с правильным значением тоже(радости нет предела), все работает как нужно, возвращаюсь в исходную сцену и (радость кончилась) значение переменной осталось исходным. Че с этими клонами объектов то делать, я так понял скрипт берет значение переменной с оригинала, а не с клона скрипта.Объекта.
|
Ответ: Как скрипты общаются
Сделать проверку на существование обьекта. Обьект не просто вставить в сцену, а инстансить его в старте и при этом проверять существование клонов.
|
Ответ: Как скрипты общаются
У меня в сцене1 два объекта, однин со скриптом действия, в нем тогглам меняется значение бул переменной. Второй со скриптом в котором я нахожу первый объект и беру зна.чение переменной, пока все хорошо, значения меняются синхронно в переменных обоих скриптов. Второй скрипт сделал донтдистракт. Переходим во вторую сцену : изночально в ней был только один объект со скриптом который находит появившийся донтдистракт объект и берет значение переменной(значение переменной из первой сцены, после изменения, а не дефолтное) и корректно выполняет свое предназначение(поко все хорошо), но перейдя из сцены2 в 1, мы имеем уже два донтдистройт объекта и значение переменной берецца из первого, а если снова перейти в сцену 2, то там тоже появился еще один донтдистройт объект, но значение переменной осталось такоеже, как при первом переходе.
Так вот как этого избежать? Чтобы донтдистракт объект был как-бы один, а не копировался, и перемесчался из сцены в сцену? |
Ответ: Как скрипты общаются
Написал же выше.
Цитата:
Код:
public GameObject Main; |
Часовой пояс GMT +4, время: 10:51. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot