Функция изменения фона кнопки-переключателя при нажатии

Я создаю функцию для изменения фонового изображения кнопки-переключателя при ее нажатии, но у меня это не работает.

В настоящее время у меня есть эта функция:

public Image Background1;
public Image Background2;
public Toggle theToggle;

public void ChangeBackground()
        {
        if (theToggle.isOn) {
            theToggle.image () = Background1;
        }
        else
        {
            theToggle.image() = Background2;
            }
        }

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

using UnityEngine.UI;

Кроме того, я попытался поместить функцию ChangeBackground() внутри функции Update(), как это, и я получаю ошибку синтаксического анализа:

public Image Background1;
public Image Background2;
public Toggle theToggle;

void Update () 
    {
        public void ChangeBackground()
        {
        if (theToggle.isOn) {
            theToggle.image () = Background1;
        }
        else
        {
            theToggle.image() = Background2;
            }
        }
    }

Эта ошибка синтаксического анализа очень странная, потому что я делал это в других сценариях. Вы можете помочь мне?


person Grow Animation    schedule 10.03.2016    source источник
comment
у вас просто есть (), которого там быть не должно. это просто .image=   -  person Fattie    schedule 10.03.2016
comment
НЕ делайте +=, как показано ниже; это не твоя проблема.   -  person Fattie    schedule 10.03.2016


Ответы (1)


Ну, во-первых, у вас есть ошибка компилятора, потому что вы пытаетесь вызвать функцию «изображение» и одновременно присвоить ей значение. Я предполагаю, что вы хотели установить атрибут изображения для некоторой переменной типа Sprite "Background1"

Итак, вы бы изменили это так:

public void ChangeBackground()
{
        if (theToggle.isOn) {
            theToggle.image = Background1;
        }
        else
        {
            theToggle.image = Background2;
            }
        }        
}

Теперь при ошибке компилятора инспектор не будет обновляться новыми полями из скрипта. Итак, если вы где-то в своем скрипте объявили переменные (обычно после объявления класса), например:

public Image background1;
public Image background2;

Они появятся в инспекторе, ожидая установки, если у вас нет ошибок компилятора и они общедоступны.

Кроме того, вы не можете поместить объявление функции, да и не хотели бы, в C# и большинстве языков программирования.

Вы ДОЛЖНЫ перетащить функцию ChangeBackground НА ПЕРЕКЛЮЧАТЕЛЬ. Перетащите сюда...

введите здесь описание изображения


Примечание! нижеследующее представляет собой очень сложную информацию, не имеющую непосредственного отношения к вопросу Гроу как таковому.

Простой способ применить функцию ChangeBackground всякий раз, когда переключатель переключается, вы можете просто сделать это в сценарии, включив эти две функции:

void OnEnable()
{
    theToggle.onValueChanged += ChangeBackground
}

void OnDisable()
{
    theToggle.onValueChanged -= ChangeBackground
}
person Bilal Itani    schedule 10.03.2016
comment
Я только что добавил объявление переменных в ответ, сейчас я посмотрю ваш ответ, спасибо! - person Grow Animation; 10.03.2016
comment
Почему я не могу поместить эту функцию в Update()? - person Grow Animation; 10.03.2016
comment
Я редактировал ответ несколько раз; см. новый низ для вызова функции при каждом изменении переключателя. - person Bilal Itani; 10.03.2016
comment
Вы не можете поместить функцию в Update, потому что вы пытаетесь сообщить компилятору что-то, чего он не понимает. Вы можете вызвать функцию в Update следующим образом: void Update() { ChangeBackground(); }, но опять же, вы бы этого не хотели, потому что это будет выполнять ненужную проверку и устанавливать фон на себя каждый тик, в то время как вы можете просто подписать функцию на событие, как я сделал в функции OnEnable, которая будет вызывать только это когда вы меняете значение переключателя. - person Bilal Itani; 10.03.2016
comment
привет @BilalItani .. вторая часть вашего ответа совершенно не нужна в unity3D .. вы просто перетаскиваете это соединение на переключатель в редакторе. - person Fattie; 10.03.2016
comment
привет @BilalItani Я отредактировал объяснение и изображение. конечно, то, что ты сказал, правильно, но ты слишком продвинут, Билал! :) ОП просто должен знать, как перетаскивать в редакторе - person Fattie; 10.03.2016
comment
@JoeBlow Я знаю, что вы можете перетаскивать, я планировал включить изображение, но у меня было мало времени. Спасибо за добавление! В качестве примечания, однако, как правило, лучше обращаться через скрипт, поскольку перетаскивание в инспекторе может немного дезорганизовать, а также требует, чтобы игровые объекты, на которые вы ссылаетесь, уже находились в сцене. Это означает, что если вы хотите добавить функциональность только что созданного вами игрового объекта, вам придется сделать это с помощью скрипта. На мой взгляд, лучше всего заранее знакомить с лучшими практиками, чтобы у людей не возникало особых проблем с исправлением старого кода в случае необходимости. - person Bilal Itani; 10.03.2016
comment
привет @BilalItani! да, хорошо, что даже абсолютные новички знакомы с динамической техникой. - person Fattie; 10.03.2016