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