Как сделать чтобы кнопка нажималась при прикосновении? unity

215
13 мая 2018, 04:00

Практикуюсь в Unity и на данный момент хочу создать пианино.

Как сделать, чтобы созданные (UI - buttons) кнопки срабатывали после прикосновения пальца, то есть, можно было водить по набору кнопок не отпуская пальца от экрана и при этом они воспроизводили заданный мною скрипт?

На данный момент, чтобы кнопка воспроизвела мой скрипт, нужно отпустить палец именно в её зоне.

Answer 1

Унаследоваться от Button и реализовать OnPointerDown:

public class MyBestButton : Button {
    [...]
    public override void OnPointerDown(PointerEventData eventData) {
        base.OnPointerDown(eventData);
        if (eventData.button != PointerEventData.InputButton.Left) return;
        // здесь делаем всякое разное       
    }
}

Ну или через AddComponent навесить триггер, если не хотите классов создавать:

EventTrigger trigger = myButton.gameObject.AddComponent<EventTrigger>();
var pointerDown = new EventTrigger.Entry();
pointerDown.eventID = EventTriggerType.PointerDown;
pointerDown.callback.AddListener(delegate(BaseEventData arg0) { 
    // тут делаем всякое разное
});
trigger.triggers.Add(pointerDown);
Answer 2

Можно посмотреть в сторону реализации интерфейсов Event System. В вашем случае это может быть IPointerEnterHandler.

Т.е. классу задаётся наследование от данного интерфейса, пишется реализация этого метода, а сам класс вешается на объект-клавишу.

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

Answer 3

Можете рассмотреть альтернативный метод, как бы велосипед, достаточно в ваш скрипт добавить использование интерфейса и всё.

public class Keys: MonoBehaviour, IPointerDownHandler, IPointerUpHandler {
    public AudioClip Sound;
    public AudioSource source; // ну или сразу запихите этот аудиоСурс в поле, дабы не вызывать GetComponent.
    public Image image; // можете такое добавить, если хотите регулировать цвет самостоятельно, без использования компонента Button
    void Start(){
        source = GetComponent<AudioSource>();
    }
    public void OnPointerDown(PointerEventData eventData){
        source.PlayOneShot(Sound);
        image.color = Color.yellow;
    }
    public void OnPointerUp(PointerEventData eventData){ // это опционально
        image.color = Color.white;
    }
}

Рекомендую вам не использоваться AddComponent так как это трудоёмкий процесс добавления компонента на объект.

READ ALSO
Не работает Drag Drop в Label

Не работает Drag Drop в Label

Нашел вот такой примерhttps://www

175
Динамические контролы (TextBox)

Динамические контролы (TextBox)

У меня создаются по нажатию на кнопку контролы, два TextBox Вопрос: как мне получить значение нужного контрола? Если допустим, они создаются и у каждого...

251
WindowsForms в visual studio code

WindowsForms в visual studio code

При попытках компиляции C# высвечивается ошибка, что комп не знает что такое SystemWindows

242
Достать номер элемента внутри корня

Достать номер элемента внутри корня

У меня есть treeViewВ нем корень, от корня идут ветки

196