Jump to content

Unity как из скрипта получить доступ к другом скрипту?


Recommended Posts

Как на C# в Unity получить доступ к переменным другого скрипта? Если в видео вам не понятно, то разжую на пальцах.

 

 

Для примера у вас на GameObject (так называют любой объект на сцене) висит 2 скрипта, вам нужно, чтобы один скрипт у другого мог вызывать его функции или менять переменные.

Получить доступ к скрипту на том же объекте

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

 

Весь код делается  в первом скрипте, сначала мы создаем переменную, в методе Awake или Start приписываем ей ссылку, и далее уже в нужных местах (Start или Update) будем через нее обращаться к "членам" (функциям и переменным) второго скрипта.

 

Вы должны знать имя второго скрипта, это имя (название скрипта, оно же является классом) будет "типом переменной". Официальная терминология очень умная и непонятная, поэтому скажу проще - создаете переменную, как обычно, вроде "private int X", только вместо типа int используете название вашего скрипта (оно же класс). Например, "private HealthSystem ImyaPeremennoi", таким образом вы создали переменную, в которую можно положить ссылку на скрипт, который называется HealthSystem (в вашем случае название скрипта другое). Название переменной может быть любым, а тип переменной должен быть таким же, как название второго скрипта, с которым вы хотите работать из первого.

 

Итак, вы создали переменную, тип которой совпадает с названием второго скрипта, а имя переменной может быть любым. Теперь в эту переменную нужно положить ссылку на второй скрипт, так как мы создали лишь пустой "контейнер", и задали его "тип", но еще не указали, какой конкретно экземпляр этого скрипта будет находиться в переменной. А экземпляров может быть несколько, если у вас один и тот же (второй) скрипт прикреплен к нескольким объектам.

 

Component Unity.pngПоэтому после строчки "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();

 

 

Link to post
Share on other sites
 
  • 1 month later...
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Powered by Invision Community
Поддержка Invision Community в России

×
  • Create New...