2016-08-28 3 views
2

Я новичок в единстве и создании игры, я использую 2 кнопки (IncreaseButton, DecreaseButton), проблема в том, что функции обратного вызова кнопки вызывают только один раз, когда пользователь нажимает на кнопку но не при нажатии кнопки. Как я могу повторно нажимать кнопку при удерживании кнопки?Код запуска, когда кнопка удерживается

Код

public void IncreaseBPM() 
{ 
    if (speed < 12) 
    { 
     speed += 0.05f; 
     bpmText.GetComponent<BeatTextControl>().beats += 1; 
     PlayerPrefs.SetFloat ("savedBPM", speed); 
    } 
} 

public void DecreaseBPM() 
{ 
    if (speed > 1.5) 
    { 
     speed -= 0.05f; 
     bpmText.GetComponent<BeatTextControl>().beats -= 1; 
     PlayerPrefs.SetFloat ("savedBPM", speed); 
    } 
} 
+0

Поместите его в цикл, который проверяет, нажата ли кнопка? –

ответ

0

хорошо так, во-первых вы создаете 2 булевы:

bool increase = false; 
bool decrease = false; 

затем установить их в функции

public void WhenButtonClicked() 
    { increase = true; } 
public void WhenOtherButtonClicked() 
    { decrease = true; } 

Далее в функции обновления внутри того же файла, проверьте:

Void update(){ 
    If(increase){ IncreaseBPM(); } 
    Else if(decrease){ DecreaseBPM(); } 
} 

О том, когда кнопка освобождается, я нашел простой ответ: http://answers.unity3d.com/questions/843319/46-gui-button-onrelease.html

Добавить на трибуну компонент события (в меню событий). Оттуда вы можете добавить слушателя для OnPointerUp. Относитесь к нему как к , так и к OnClick.

И создайте еще 2 функции, которые увеличивают и уменьшают значение false!

+0

can not я использую только что выбранное обновление и указатель вверх .. ?? –

1

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 к CanvasCanvas, который является родителем вашего Images/Buttons UI GameObjects. Создайте два Images (увеличение и уменьшение). Создайте два tags под названием increase и decrease, затем поместите оба Images вправо tag.

Примечание:

Вы можете использовать Button вместо Image, чтобы сделать эту работу, если вы не хотите использовать Image компонент. Просто выберите каждый Button и измените метки на increase и decrease, затем выберите Text элемент, который находится под каждым Button и измените свои метки increase и decrease. Также вы должны изменить теги Button10, если вы хотите использовать компонент 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 не будет вызываться. Также использование проблем с несколькими касаниями на мобильных устройствах также вызовет проблемы.

Смежные вопросы