Jump to content

Unity методы доступа к скриптам и объектам


Recommended Posts

Рассмотрим, как в 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 () {
		
	}
}

 

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

Как получить ссылку на объект, имеющий определенный скрипт

 

//покажу на примере, как я находил скрипт контроллера игрока на сцене, 
//в другом скрипте (который хочет получить ссылку на контроллер) пишем:

FirstPersonAIO firstPersonAIO; //ссылка на скрипт контроллера от первого лица

void Start()
{
  //берем переменную, которая будет ссылкой на нужный нам объект
  //присваиваем ей значение (=) такое: найти объект типа FirstPersonAIO (FindObjectOfType(typeof(FirstPersonAIO)))
  //после чего привести его в этот же тип ( as FirstPersonAIO)
firstPersonAIO = FindObjectOfType(typeof(FirstPersonAIO)) as FirstPersonAIO; 
}
//после этого переменная firstPersonAIO будет ссылаться на компонент FirstPersonAIO, находящийся на вашем объекте
//учтите, что этот способ находит первый попавшийся объект типа FirstPersonAIO (FirstPersonAIO.cs), если он
//всего один на сцене, то проблем не будет. Также он должен быть активен.

 

Link to post
Share on other sites
 

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...