Хорошо, это будет немного глубже.
Учтите это:
Button button;
void Start()
{
button.onClick.AddListener(Method);
}
void Method()
{
print("Hey");
}
Все идет хорошо, ваш компонент Button получает "ссылку" на Method, поэтому, когда onClickзапускается, он переходит на адрес метода и запускает код оттуда.
Второй сценарий:
Button button;
void Start()
{
button.onClick.AddListener(Method);
Destroy(this);
}
void Method()
{
print("Hey");
}
Обратите внимание, что я уничтожаю текущий компонент, запускаю его и запускаю onClick, и никаких проблем(?? !!), печатается нормально.
Третий сценарий:
Button button;
string str = "Hey there";
void Start()
{
button.onClick.AddListener(Method);
Destroy(this);
}
void Method()
{
print(this.str);
}
Вылетает.А теперь для объяснения.Метод ВСЕГДА статичен, компилятор (или создатели) достаточно умен, чтобы считать, что нет необходимости для каждого экземпляра иметь свой собственный метод, а вместо этого иметь шаблон общего метода, в который экземпляр может передать себя.
Методы таковы:
void ClassName.MethodName(this ClassName);
Этот параметр перемещается вперед при использовании вызова экземпляра и делается необязательным.Этот параметр действительно доступен в методе, так как вы можете его использовать.Опять же, это не обязательно.
Итак, в первом случае это работает, хотя сценарий больше не существует, это потому, что не было никакого использования какого-либо члена экземпляра.В последнем примере используется str, и поскольку объект больше не существует, он выдает исключение нулевой ссылки.
С учетом обратного.
Если сценарий созданияостается, а игровой объект или компонент Button уничтожается, тогда вы вообще не рискуете.Было бы разумнее очистить событие onClick, но, поскольку оно будет уничтожено, наоборот.Ваш создатель теряет знание кнопки на следующей итерации цикла, в котором создаются все кнопки:
for(i=0;i<10;i++)
{
GameObject go = null; // new reference added on method stack
go = Instantiate<GameObject>(btnPrefab); // new instance added to reference
} // go connection is lost right here, a new go added to stack in next iteration