Button
компонент Юнити делает не есть эта функция встроена. Вы должны раскрутить свой собственный с Image
компонента в качестве Button
. Внедрите интерфейс IPointerDownHandler
и IPointerUpHandler
, затем переопределите функции OnPointerDown
и OnPointerUp
.
Когда OnPointerDown
называется, используйте struct
для хранения которых объект/объем Image
щелкают и текущий щелчок pointerId
в List
. Затем вы можете проверить, какая Image
нажата в функции Update
.
Если OnPointerUp
называется, вы должны проверить, какие pointerId
отпускания затем проверьте, что pointerId
существуют в List
и удалить его, если он делает.
Я пошел вперед, чтобы сделать это. Ниже приведен новый сценарий в вашем вопросе:
public class ButtonTest : MonoBehaviour
{
// Use this for initialization
void Start()
{
//Register to Button events
ButtonDownRelease.OnButtonActionChanged += ButtonActionChange;
Debug.Log("Registered!");
}
// Update is called once per frame
void Update()
{
}
//Un-Register to Button events
void OnDisable()
{
ButtonDownRelease.OnButtonActionChanged -= ButtonActionChange;
}
//Will be called when there is a Button action
void ButtonActionChange(ButtonAction buttonAction)
{
//Check for held down
if (buttonAction == ButtonAction.DecreaseButtonDown)
{
Debug.Log("Decrease Button held Down!");
DecreaseBPM();
}
if (buttonAction == ButtonAction.IncreaseButtonDown)
{
Debug.Log("Increase Button held Down!");
IncreaseBPM();
}
//Check for release
if (buttonAction == ButtonAction.DecreaseButtonUp)
{
Debug.Log("Decrease Button Released!");
}
if (buttonAction == ButtonAction.IncreaseButtonUp)
{
Debug.Log("Increase Button Released!");
}
}
private void IncreaseBPM()
{
if (TempoController.GetComponent<Pendulum>().speed < 12)
{
TempoController.GetComponent<Pendulum>().speed += 0.05f;
}
}
private void DecreaseBPM()
{
if (TempoController.GetComponent<Pendulum>().speed > 1.5)
{
TempoController.GetComponent<Pendulum>().speed -= 0.05f;
}
}
}
Читай внимательно.
Создайте новый скрипт под названием ButtonDownRelease
, а затем введите код в него. Прикрепите сценарий ButtonDownRelease
к Canvas
Canvas
, который является родителем вашего Images
/Buttons
UI GameObjects. Создайте два Images
(увеличение и уменьшение). Создайте два tags
под названием increase
и decrease
, затем поместите оба Images
вправо tag
.
Примечание:
Вы можете использовать Button
вместо Image
, чтобы сделать эту работу, если вы не хотите использовать Image
компонент. Просто выберите каждый Button
и измените метки на increase
и decrease
, затем выберите Text
элемент, который находится под каждым Button
и измените свои метки increase
и decrease
. Также вы должны изменить теги Button
10, если вы хотите использовать компонент Button
с этим скриптом. Кроме того, вам нужно будет присоединить ButtonDownRelease
к каждому Button
не к Canvas
, как вам нужно, с помощью Image
компонента.
Ваш ButtonDownRelease
сценарий:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections.Generic;
public class ButtonDownRelease : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
List<ButtonInfo> buttonInfo = new List<ButtonInfo>();
public delegate void ButtonActionChange(ButtonAction buttonAction);
public static event ButtonActionChange OnButtonActionChanged;
// Update is called once per frame
void Update()
{
//Send Held Button Down events
for (int i = 0; i < buttonInfo.Count; i++)
{
if (buttonInfo[i].buttonPresed == ButtonAction.DecreaseButtonDown)
{
dispatchEvent(ButtonAction.DecreaseButtonDown);
}
else if (buttonInfo[i].buttonPresed == ButtonAction.IncreaseButtonDown)
{
dispatchEvent(ButtonAction.IncreaseButtonDown);
}
}
}
void dispatchEvent(ButtonAction btAction)
{
if (OnButtonActionChanged != null)
{
OnButtonActionChanged(btAction);
}
}
public void OnPointerDown(PointerEventData eventData)
{
//Debug.Log("Button Down!");
ButtonInfo bInfo = new ButtonInfo();
bInfo.uniqueId = eventData.pointerId;
if (eventData.pointerCurrentRaycast.gameObject.CompareTag("increase"))
{
bInfo.buttonPresed = ButtonAction.IncreaseButtonDown;
addButton(bInfo);
}
else if (eventData.pointerCurrentRaycast.gameObject.CompareTag("decrease"))
{
bInfo.buttonPresed = ButtonAction.DecreaseButtonDown;
addButton(bInfo);
}
}
public void OnPointerUp(PointerEventData eventData)
{
//Debug.Log("Button Down!" + eventData.pointerCurrentRaycast);
removeButton(eventData.pointerId);
}
void addButton(ButtonInfo bInfo)
{
buttonInfo.Add(bInfo);
}
void removeButton(int unqID)
{
for (int i = 0; i < buttonInfo.Count; i++)
{
if (unqID == buttonInfo[i].uniqueId)
{
//Send Release Button Up events
if (buttonInfo[i].buttonPresed == ButtonAction.DecreaseButtonDown)
{
dispatchEvent(ButtonAction.DecreaseButtonUp);
}
else if (buttonInfo[i].buttonPresed == ButtonAction.IncreaseButtonDown)
{
dispatchEvent(ButtonAction.IncreaseButtonUp);
}
buttonInfo.RemoveAt(i);
}
}
}
public struct ButtonInfo
{
public int uniqueId;
public ButtonAction buttonPresed;
}
}
public enum ButtonAction
{
None,
IncreaseButtonDown, IncreaseButtonUp,
DecreaseButtonDown, DecreaseButtonUp
}
Наконец, вы столкнетесь с проблемами, если вы используете только boolean
переменные, чтобы сделать это.Это нужно сделать с помощью pointerId
, как и сценарий, предоставленный в этом ответе, чтобы избежать ошибок на мобильных устройствах. Хорошим примером этой ошибки является то, что когда вы нажимаете на Image
, затем отпустите палец на другой GameObject, ваша логическая логика будет перерыв, потому что OnPointerUp
не будет вызываться. Также использование проблем с несколькими касаниями на мобильных устройствах также вызовет проблемы.
Поместите его в цикл, который проверяет, нажата ли кнопка? –