Показать сообщение отдельно
Старый 27.04.2012, 14:04   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Как скрипты общаются

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

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

Допустим есть у нас такой скрипт
using UnityEngine;

// скрипт, к переменной которого мы хотим получить доступ
public class ScriptWithVariable
{
   
// переменная, к которой мы хотим получить доступ
   
public int myPublicVariable;

Далее мы хотим из другого скрипта на том же объекте менять эту переменную. Есть несколько способов это сделать:
  • Назначить ссылку на скрипт ScriptWithVariable в редакторе через публичную переменную
  • Получить ссылку на скрипт ScriptWithVariable в начале работы скрипта
  • Получать скрипт перед изменением

Первый вариант подразумевает, что вы создадите публичную

using UnityEngine;

public class 
VariableChanger
{
   
// переменная, которая отобразится в редакторе Unity 
   // и на которую надо перетащить скрипт ScriptWithVariable с того же или иного объекта сцены
   
public ScriptWithVariable scriptWithVariable;

   public 
void Update()
   {
     
// изменение нужной нам переменной
     
scriptWithVariable.myPublicVariable++;
   }


Второй вариант подразумевает поиск скрипта у объекта и сохранение ссылки на него.
Допустим мы забыли указать скрипт с помощью редактора, но знаем что он должен быть, тогда можно написать код, который его найдет в начале работы скрипта.

using UnityEngine;

public class 
VariableChanger
{
   
// переменная, которая отобразится в редакторе Unity 
   // и на которую надо перетащить скрипт ScriptWithVariable с того же или иного объекта сцены
   
public ScriptWithVariable scriptWithVariable;

   
// добавляем код поиска
   
public void Awake()
   {
      
scriptWithVariable GetComponent<ScriptWithVariable>();
   }

   public 
void Update()
   {
     
// изменение нужной нам переменной
     
scriptWithVariable.myPublicVariable++;
   }


Третий вариант самый не оптимальный для использования в каждом кадре (Update вызывается каждый кадр). Но зато эффективен для разового использования т.к. нет необходимости в создании переменной-ссылки на нужный нам скрипт.

using UnityEngine;

public class 
VariableChanger
{
   public 
void Start()
   {
      
// изменение нужной нам переменной
      
GetComponent<ScriptWithVariable>().myPublicVariable 100500;
   }


Вызов методов других скриптов

Все что описано про публичные переменные относится и к вызову методов.
Имеем скрипт:

using UnityEngine;

// скрипт, метод которого мы хотим вызвать
public class ScriptWithVariable
{
   public 
int myPublicVariable;

   
// метод который надо вызвать
   
public void ChangeVariable()
   {
      
myPublicVariable++;
   }


Ну и собственно пример вызова:

using UnityEngine;

public class 
VariableChanger
{
   public 
void Start()
   {
      
// изменение нужной нам переменной путем вызова метода скрипта
      
GetComponent<ScriptWithVariable>().ChangeVariable();
   }


Сообщения

Вызвать метод скрипта объекта можно так же послав сообщение этому объекту (не скрипту). Но данный способ медленнее описанного выше.

using UnityEngine;

public class 
VariableChanger
{
   public 
void Start()
   {
      
// изменение нужной нам переменной путем вызова сообщения
      
SendMessage("ChangeVariable");
   }

Данный способ вызовет метод ChangeVariable на всех скриптах текущего объекта, в которых он объявлен с тем же именем.


Ну вот и все что хотел рассказать. Данная статья так же есть на wiki
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Andvrok (25.01.2013), Dzirt (28.04.2012), EvilOkta (25.02.2013), Lowlet (03.05.2012), Черный крыс (31.07.2012)