Владимир Шека 4 Share Posted May 21, 2018 Как на C# в Unity получить доступ к переменным другого скрипта? Если в видео вам не понятно, то разжую на пальцах. Для примера у вас на GameObject (так называют любой объект на сцене) висит 2 скрипта, вам нужно, чтобы один скрипт у другого мог вызывать его функции или менять переменные. Получить доступ к скрипту на том же объекте Синтаксис получения. Сначала вам в первом скрипте необходимо создать переменную, которая будет ссылаться на второй скрипт вашего GameObject. Потом положить в эту переменную ссылку на второй скрипт, далее использовать переменную для работы с переменными и функциями второго скрипта. И все. Очень просто, теперь как это делается. Весь код делается в первом скрипте, сначала мы создаем переменную, в методе Awake или Start приписываем ей ссылку, и далее уже в нужных местах (Start или Update) будем через нее обращаться к "членам" (функциям и переменным) второго скрипта. Вы должны знать имя второго скрипта, это имя (название скрипта, оно же является классом) будет "типом переменной". Официальная терминология очень умная и непонятная, поэтому скажу проще - создаете переменную, как обычно, вроде "private int X", только вместо типа int используете название вашего скрипта (оно же класс). Например, "private HealthSystem ImyaPeremennoi", таким образом вы создали переменную, в которую можно положить ссылку на скрипт, который называется HealthSystem (в вашем случае название скрипта другое). Название переменной может быть любым, а тип переменной должен быть таким же, как название второго скрипта, с которым вы хотите работать из первого. Итак, вы создали переменную, тип которой совпадает с названием второго скрипта, а имя переменной может быть любым. Теперь в эту переменную нужно положить ссылку на второй скрипт, так как мы создали лишь пустой "контейнер", и задали его "тип", но еще не указали, какой конкретно экземпляр этого скрипта будет находиться в переменной. А экземпляров может быть несколько, если у вас один и тот же (второй) скрипт прикреплен к нескольким объектам. Поэтому после строчки "private HealthSystem ImyaPeremennoi;" в методе Awake/Start нам надо сделать следующее ""ImyaPeremennoi = GetComponent<HealthSystem>();". То есть до этого мы создали переменную и решили, какого она будет типа. А сейчас мы засунули в нее скрипт с названием HealthSystem (это второй скрипт), который должен находиться на том же объекте, что и первый скрипт, где мы пишем все эти строчки. Конструкция "ImyaPeremennoi = GetComponent..." значит, что в эту переменную мы поместим ссылку на какой-то компонент, который есть у нас на объекте. Это может быть Rigitbody, Collider, Transform (который автоматически есть у всех объектов) - все это компоненты. Скрипты тоже компоненты, ведь они находятся в инспекторе, и добавить их можно с помощью кнопки Add Component. В данном случае в переменную с типом (то есть с видом или "породой") "HealthSystem" мы можем поместить только скрипт HealthSystem. Итак, еще раз: мы создали переменную с определенным типом "private HealthSystem ImyaPeremennoi;", чтобы туда засунуть ссылку на скрипт. Все это делалось в одном скрипте (имя его может быть любым, главное, чтобы он был на объекте), а доступ будем получать к другому скрипту, который в нашем примере называется HealthSystem (тут как будто бы все переменные и функции, отвечающие за ХП игрока). Потом мы засунули в переменную ImyaPeremennoi ссылку на скрипт HealthSystem, написав следующее: "ImyaPeremennoi = GetComponent<HealthSystem>();". Теперь используя переменную ImyaPeremennoi мы можем через нее обращаться к переменным и функциям скрипта HealthSystem. Например, скрипте HealthSystem есть публичная переменная Zdorovie (public int Zdorovie = 100;) , отвечающая за здоровье игрока, попробуем в нашем первом скрипте изменить ее. Пишем "ImyaPeremennoi.Zdorovie = 50;" теперь наш первый скрипт напрямую меняет переменную у второго скрипта. Также первый скрипт может вызывать функции из второго скрипта, например, во втором скрипте прописана функция Jump();, вызов которой заставляет игрока подпрыгнуть. Ее можно взывать так "ImyaPeremennoi.Jump();" Как получить доступ к скрипту другого объекта Тут принципы те же, с той лишь разницей, что добавляется еще одно действие. В первом примере, когда мы писали "ImyaPeremennoi = GetComponent<HealthSystem>();", мы имели в виду следующее "ImyaPeremennoi = _у_этого_объекта_ GetComponent<HealthSystem>();", то есть компонент брали у того же объекта, на котором висит первый скрипт с этим кодом. Поэтому по умолчанию, когда вызывался GetComponent он знал, с какого объекта брать компонент. По сути мы писали в скрипте "команду", какой нужно получить компонент, но не указывали у кого мы его берем, так как подразумевается, что с себя. Сейчас же надо просто указать пальцем, у кого берем компонент. Для этого надо создать еще одну переменную, куда мы поместим ссылку на другой объект. Пишется это так "public GameObject DrugoiObiekt" - мы создаем публичную переменную (public) с названием DrugoiObiekt, и поместить в нее можно будет что-то, у чего тип GameObject. А GameObject - это "базовый" тип любого объекта на сцене. Итак, как и в первый раз мы сначала создали переменную "контейнер", которая предназначена для хранения любого GameObject'а, теперь нужно засунуть в нее конкретный объект, с которым мы будем работать. Так как мы сделали ее публичного типа (public), то вы можете в инспекторе перетащить из иерархии сцены любой объект в нее. Для этого вам нужно зайти в инспектор того объекта, на котором висит ваш первый скрипт (где мы писали весь этот код), и там появится специально поле с названием DrugoiObiekt. Когда вы туда перетяните объект, то скрипт будет знать, какой именно объект подразумеваете в переменной DrugoiObiekt. Ссылку на объект мы теперь получили, она после перетягивания хранится в DrugoiObiekt, но теперь нужно получить ссылку на скрипт, который висит на этом другом объекте. А чтобы получить ссылку на скрипт нам нужна переменная, которая ее будет хранить. А чтобы переменная хранила ссылку на скрипт, она должна быть быть таким же типом, как и название скрипта. В нашем случае у DrugoiObiekt скрипт также называется, как и раньше - это HealthSystem. Поэтому мы можем создать переменную типа HealthSystem, например, так: "private HealthSystem HealthSDrygogoObiekta;". Теперь в эту переменную-ссылку нужно "положить скрипт" с другого объекта. Делается это так "HealthSDrygogoObiekta = DrugoiObiekt.GetComponent<HealthSystem>();". Мы это уже делали, только тут всего два отличия. Первое это другое имя переменной, если раньше она называлась ImyaPeremennoi, то теперь HealthSDrygogoObiekta, а тип у этих переменных одинаковый, так как они обе предназначены для хранения ссылки на скрипт HealthSystem. Второе отличие, что теперь мы указываем у кого мы берем компонент. Если первый раз достаточно было написать "GetComponent<HealthSystem>();", и было понятно, что компонент HealthSystem мы берем с того объекта, на котором висят эти строчки кода, то теперь явно указываем объект - DrugoiObiekt. Как вы помните в переменной DrugoiObiekt у нас хранится ссылка на другой объект, который вы перетянули в инспекторе. В итоге у нас переменная HealthSDrygogoObiekta содержит ссылку на скрипт другого (внешнего, так сказать) объекта. Теперь мы можем у него менять переменные и использовать функции, которые есть в его скрипте HealthSystem. Например, "HealthSDrygogoObiekta.Zdorovie = 55;" или "HealthSDrygogoObiekta.Jump();", если у скрипте HealthSystem есть функция Jump(); Quote Link to post Share on other sites
Владимир Шека 4 Author Share Posted June 23, 2018 Также смотрите тему, где разжевано чуть по-другому, и чуть больше информации Unity методы доступа к скриптам и объектам Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.