Страница 1 из 1

Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 18 авг 2018, 13:56
JodyRedlot
Дефолтная кнопка меня не устраивает, потому необходимо создать свою. В качестве исхода использую как Image на канвасе, так и простой спрайт (с компонентом Image). Первый мне очень бы подошёл, но тот вообще никак не реагирует на скрипт, который будет ниже (скрипт вешаю на потенциальную кнопку), даже если сделать коллайдер на объекте. Спрайт же реагирует, но при каких-либо действиях мыши вместо смены спрайта кидается в меня Null Reference Exception-ами. Я не думал, что буду ТАК долго сидеть на этом месте, но прошло часа 4, а прогресса всё нет, вынужден писать сюда. В чём проблема исключений, я искренне не понимаю: все 3 спрайта в инспекторе указываю, как бы должно работать, если смотреть на то, что я видел в интернете. В общем, вот сам скрипт. Буду благодарен за подсказку, как заставить это работать на спрайте и/или на image (и последнее было бы даже лучше)
Синтаксис:
Используется csharp
public class BtnManager : MonoBehaviour {

    public Sprite n, o, c;
    [HideInInspector]
    Image curImage;
   
    void Awake()
    {
        curImage = GetComponent<Image>();
        Debug.Log(curImage.sprite); //просто так. выводит тот спрайт, который стоит
    }

        void OnClick()
    {
        curImage.sprite = c; //здесь выскакивают ошибки null reference exception
        Debug.Log(curImage.sprite); //и здесь
    }

    void OnMouseEnter()
    {
        curImage.sprite = o; //а ещё тут
        Debug.Log(curImage.sprite); //и опять ошибка
    }

    void OnMouseExit()
    {
        curImage.sprite = n;//ну и здесь, конечно же
    }
}

Re: Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 18 авг 2018, 14:05
1max1
1) OnMouse события работают только если есть коллайдер на объекте для UI есть https://docs.unity3d.com/ScriptReferenc ... igger.html
Можно еще через интерфейсы реализовать:
https://docs.unity3d.com/ScriptReferenc ... table.html
https://docs.unity3d.com/ScriptReferenc ... Enter.html

2) Исключения вылетают из-за того что переменным public Sprite n, o, c; не присвоено значение, тут либо через код присваивать спрайты, либо через инспектор.

p.s. [HideInInspector] бесполезен для private переменных.

Re: Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 18 авг 2018, 14:14
seaman
Интересно и чем Вас не устроила "дефолтная кнопка"?

Re: Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 18 авг 2018, 17:55
JodyRedlot
Не сочтите за грубость, но зачем отвечать на вопрос, который не читали?
1) "...даже если сделать коллайдер на объекте...".
Ну а за совет по поводу интерфейсов спасибо, посмотрю обязательно
2) "...все 3 спрайта в инспекторе указываю..."
Ну или вот, не знаю, может, как-то не так указываю. Хотя вроде ничего криминального: https://ibb.co/cAY28K (вставляю без тега, да, просто почему-то форуму не удаётся "определить размеры изображения". Прошу прощения за доставленные неудобства от лишнего клика мыши)
Ну и по поводу HideInInspector, хорошо, спасибо, буду иметь ввиду

Re: Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 18 авг 2018, 18:25
1max1
1) "...даже если сделать коллайдер на объекте...".

Вешаю collider box 2d на image и у меня всё прекрасно работает с OnMouse :-?

Кстати, замену спрайтов еще можно попробовать делать так:
Синтаксис:
Используется csharp
curImage.sprite = Sprite.Create(c.texture, new Rect(0.0f, 0.0f, c.texture.width, c.texture.height), new Vector2(0.5f, 0.5f), 100.0f);

Re: Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 18 авг 2018, 21:36
seaman
Так все же - ответ есть, или просто религия не позволяет работать с дефолтной кнопкой? Или блажь такая?

Re: Создание кастомной кнопки, требуется помощь в скрипте

СообщениеДобавлено: 20 авг 2018, 07:18
Bill Gates
Чтобы сделать кастомную кнопку, нужно реализовать набор интерфейсов IPointerClickHandler, IPointerDownHandler, IPointerEnterHandler и т.д.