Статьи:Как скрипты общаются

Материал из Blitz3D to Unity3D Wiki Project
Перейти к: навигация, поиск

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

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

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

using UnityEngine;

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

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

  • Назначить ссылку на скрипт ScriptWithVariable в редакторе через публичную переменную
  • Получить ссылку на скрипт ScriptWithVariable в начале работы скрипта
  • Получать скрипт перед изменением

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

using UnityEngine;

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

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


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

using UnityEngine;

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

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

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


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

using UnityEngine;

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

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

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

using UnityEngine;

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

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


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

using UnityEngine;

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

Сообщения

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

using UnityEngine;

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

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