Владимир Шека 4 Share Posted June 23, 2018 Рассмотрим, как в Unity на языке C# получать доступ из одного скрипта к переменным и функциям других скриптов. Юнити: Как обратиться к другому скрипту на том же объекте GetComponent<DrygoiScript>().peremennayaScripta = 5; Эта "команда" обращается к другому скрипту, который в виде компонента висит на том же объекте, что и скрипт, где вы это пишете. У этого скрипта есть переменная с именем peremennayaScripta, ей присваивается значение 5. Так можно обращаться к любым компонентам вашего игрового объекта, начиная от ваших скриптов, висящих на нем, и заканчивая обычными юнитивскими компонентами - Rigitbody, Animator, Transform и прочими. Unity: Как получить ссылку на другой скрипт с одного объекта Но вы можете не писать каждый раз "команду" GetComponent<>, а создать переменную для ссылки на компонент. Пишете: DrygoiScript peremennayaSsilkaNaDrygoiScript = GetComponent<DrygoiScript>(); Вы тут сначала создали переменную с именем peremennayaSsilkaNaDrygoiScript и тип переменной DrygoiScript (что означает, что туда можно поместить только ссылку на DrygoiScript, но не на любой другой скрипт). Потом вы через знак "=" присвоили этой переменной ссылку на DrygoiScript, который висит на том же объекте, что и этот скрипт с кодом. Теперь вы можете написать: peremennayaSsilkaNaDrygoiScript.peremennayaScripta = 5; Через peremennayaSsilkaNaDrygoiScript произойдет обращение к тому скрипту (это аналогично GetComponent<DrygoiScript>()), и его переменная peremennayaScripta установится в значение 5. Unity3d: как получить ссылку на другой объект На другом объекте может висеть нужный вам скрипт, и вы хотите изменить его переменные или вызвать его функцию из другого скрипта? Тогда сначала нужно получить ссылку на него. Для этого создаете переменную в исходном скрипте: public GameObject ssilkaNaObject; Тут вы создали публичную переменную (теперь она будет видна в инспекторе) с типом GameObject (это базовый тип для любого объекта на сцене) и именем ssilkaNaObject. Теперь в инспектор вы можете перетянуть в нее нужный вам объект. Но надо еще получить ссылку на конкретный компонент (скрипт или еще что-либо навешанное на него) этого объекта. Например, на объекте висит скрипт с именем DrygoiScript, и вы хотите получить к нему доступ: ssilkaNaObject.GetComponent<DrygoiScript>().peremennayaScripta = 5; Тут вы по ссылке ssilkaNaObject обращаетесь к объекту, который перетянули в инспекторе в переменную ssilkaNaObject, и далее обращаетесь к конкретному компоненту GetComponent<DrygoiScript>(), это нужный вам скрипт, и меняете у этого скрипта переменную под названием peremennayaScripta на 5. Аналогично с вызовом какой-либо функций: ssilkaNaObject.GetComponent<DrygoiScript>().MyFuction(); Тут вы вызвали функцию с именем MyFuction() в скрипте DrygoiScript, который висит на ssilkaNaObject. Юнити: как кешировать ссылку на ваш скрипт Но GetComponent<> ресурсозатратная операция, поэтому лучше сразу создать переменную, чтобы положить туда ссылку на конкретный компонент (ваш скрипт). Ссылку на объект мы уже получили, и она называется ssilkaNaObject, но не получили ссылку на скрипт DrygoiScript, поэтому и приходится каждый раз писать GetComponent<DrygoiScript>(). DrygoiScript peremennayaSsilkaNaDrygoiScript = ssilkaNaObject.GetComponent<DrygoiScript>(); Теперь переменная peremennayaSsilkaNaDrygoiScript будет содержать ссылку на ваш скрипт, который висит на объекте, на который ссылается ssilkaNaObject. И можно без всяких GetComponent писать: peremennayaSsilkaNaDrygoiScript.peremennayaScripta = 5; // изменение значения переменной в другом скрипте peremennayaSsilkaNaDrygoiScript.MyFuction(); // вызов функции другого скрипта Это называется кеширование. Мы с вами закешировали, как сам объект, на котором скрипт, так и ссылку на скрипт. Грубо говоря - кеширование это создание ссылки на нужную вещь, по которой потом можно обращаться к объекту, чтобы не приходилось каждый раз его искать заново. Юнити3Д: как получить доступ к объекту из другого скрипта До этого мы нужный нам объект переносили вручную через инспектор Unity в переменную ssilkaNaObject , но получить к нему доступ из кода можно несколькими способами. public GameObject ssilkaNaObject; // не забывайте создавать переменную, которая будет ссылкой на объект ssilkaNaObject = GameObject.Find("ИмяОбъектаПоИерархии"); // поиск объекта по имени Тут в переменную ssilkaNaObject мы заносим то, что найдет компьютер по имени в иерархии сцены Unity. Минус в том, что придется запоминать, что переименовывать объект нельзя. ssilkaNaObject = GameObject.FindGameObjectWithTag("Player"); // поиск объекта по тегу Так мы получим ссылку на первый объект, который найдет компьютер по тегу Player (задается в инспекторе). Если объектов несколько с одним тегом, то в ссылку компьютер положит первый попавшийся. Советы Все операции, когда вы переменной присваиваете ссылку на объект или компонент (скрипт) проводят, как правило, в методе Start. Сами переменные создаются вне методов, чтобы они были доступны по всему скрипту, а не были локальными в каком-то методе. А значения им присваиваются в методе Start, который срабатывает когда запускается сцена, тогда Unity3d и найдет нужный объекты, и запишет в ваши переменные ссылки на них. Например: using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestPoiskObjectov : MonoBehaviour { // это место вне каких-либо методов public GameObject ssilkaNaObject; // не забывайте создавать переменную, которая будет ссылкой на объект public DrygoiScript peremennayaSsilkaNaDrygoiScript; // переменная для ссылки на конкретный скрипт void Start () { // поиск объекта по имени ssilkaNaObject = GameObject.Find("ИмяОбъектаПоИерархии"); // получение ссылки на компонент с другого объекта DrygoiScript peremennayaSsilkaNaDrygoiScript = ssilkaNaObject.GetComponent<DrygoiScript>(); } void Update () { } } Quote Link to post Share on other sites
Владимир Шека 4 Author Share Posted June 23, 2018 Также смотрите тему с видео: Unity как из скрипта получить доступ к другом скрипту? Quote Link to post Share on other sites
Владимир Шека 4 Author Share Posted August 19, 2019 Как получить ссылку на объект, имеющий определенный скрипт //покажу на примере, как я находил скрипт контроллера игрока на сцене, //в другом скрипте (который хочет получить ссылку на контроллер) пишем: FirstPersonAIO firstPersonAIO; //ссылка на скрипт контроллера от первого лица void Start() { //берем переменную, которая будет ссылкой на нужный нам объект //присваиваем ей значение (=) такое: найти объект типа FirstPersonAIO (FindObjectOfType(typeof(FirstPersonAIO))) //после чего привести его в этот же тип ( as FirstPersonAIO) firstPersonAIO = FindObjectOfType(typeof(FirstPersonAIO)) as FirstPersonAIO; } //после этого переменная firstPersonAIO будет ссылаться на компонент FirstPersonAIO, находящийся на вашем объекте //учтите, что этот способ находит первый попавшийся объект типа FirstPersonAIO (FirstPersonAIO.cs), если он //всего один на сцене, то проблем не будет. Также он должен быть активен. 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.