при нажатии на кнопку нужно включить некоторые объекты и включить некоторые объекты
void OptionFunction()
{
batteryLevelScript.image.SetActive(false);
timeMangerScript.text.SetActive(false);
exitScript.Button.SetActive(true);
if (AsistantControllScript.Assistant) {
// assistantOnScript.Button.SetActive(false);
assistantOffScript.Button.SetActive(true);
}
else
{
// assistantOffScript.Button.SetActive(false);
assistantOnScript.Button.SetActive(true);
}
Button.SetActive(false);
}
Структура проекта следующая: сначала на экране одна основная кнопка и больше ничего (в скрипте этой кнопки в самом начале прописано отключить все компоненты, которые должны когда-то быть на сцене), потом нажимаешь на эту кнопку, и она выключается и появляется кнопка с настройками, показ уровня заряда аккумулятора телефона, текущую дату и время, и появляется помощник дополненной реальности. а если нажать кнопку с настройками то отображение текущего уровня заряда батареи, отображение текущего времени и сама кнопка с настройками ставятся на false, но должны появиться следующие кнопки: кнопка для выхода из настроек, и кнопка для выключения помощника, или кнопка для включения помощника, если он выключен.
Все работает, кроме одного: при нажатии на кнопку с настройками все идет нормально, кроме одного - кнопок включения и выключения - ни одна из них просто не появляется! Все посмотрел в Unity - не нашел ничего, что могло бы помешать их успешному включению, но проблема никуда не делась, при нажатии на кнопку настроек в проекте появляется ошибка: NullReferenceException: Ссылка на объект не задана для экземпляр объекта. И еще я заметил: если вы напишете код, который отвечает за отключение компонентов, прежде чем проверять, включен ли помощник или нет, то все идет хорошо, но если вы напишете это после, то код для отключения этих компонентов не выполняется. Я не могу понять в чем проблема: происходит проверка на то что активен ассистент или нет, и затем уже включается так кнопка которая нужна, но почему-то такого не происходит... в чем может быть причина?
Ответы (2 шт):
Если компонент, к которому прикреплен скрипт, отключен, например, командой SetActive(false), то скрипт работать не будет.
Насколько я поняла, у вас скрипт висит на главной кнопке, которая потом отключается. Тут нужно или убедиться, что все нужные функции и проверки выполняются до того, как вы деактивируете кнопку (если это возможно), или лучше будет создать отдельный GameObject, на который повесить ваш скрипт и который всегда будет активным и в нем уже через public поля указать все кнопки и прописать, что когда должно появляться/исчезать. Надеюсь, правильно поняла вашу проблему!
Если ваша кнопка должна включать-выключать какие-либо другие объекты, то вы можете дать на них ссылки в скрипте, прикрепляемом к этой кнопке. Лучше это делать все же через [SerializeField] private, а не public, так как другим скриптам вряд ли когда-либо понадобятся эти ссылки.
Например, если ваша кнопка при нажатии должна включать/отключать объекты LeaveSettingsButton, ActivateAssistantButton при нажатии:
[SerializeField] private GameObject LeaveSettingsButton;
[SerializeField] private GameObject ActivateAssistantButton;
private bool isActive;
public void onClick () {
isActive = !isActive;
}
Если же вы хотите, чтобы ваша кнопка сама отключалась после нажатия на нее (то есть с ее помощью можно только включить другие объекты), то команда будет setActive(true), а кнопку вы отключаете после всех операций, потому что:
- После отключения компонента, он полностью перестает выполнять все свои функции
- После отключения объекта через setActive(false), все компоненты и скрипты на нем перестают выполнять свою работу!
То есть вам нужно что-то такое:
[SerializeField] private список_объектов_для_включения
public void OnClick () {
объект.setActive(true);
setActive(false); // отключаем сам объект
}