2016-11-14 10 views
0

Я пытаюсь создать объект SongManager, который будет отвечать за изменение песен. Я создал SongManager и скрипт Song. В runtime SongManager создает столько кнопок песни, сколько я хочу, каждый с разными переменными. Кажется, все работает отлично, за исключением того, что я не могу попасть в событие OnClick, чтобы изменить песни. Я пробовал много вещей, но, думаю, все устарел. Такие вещи, как:Как получить доступ к событию OnClick через скрипт

public Button.ButtonClickedEvent OnClickEvent; 

или

go.GetComponent<Button>().onClick.AddListener(); 

Цените любую помощь, спасибо у парней.

enter image description here

enter image description here

enter image description here

enter image description here

ответ

1

Вы можете использовать Events для comminucation с другими классами. Вот код:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class SongButton : MonoBehaviour { 

    public delegate void SongButtonEvent(int index); 
    public static event SongButtonEvent OnSongButtonClick; 
    void ClickSongButton(){ 
     if (OnSongButtonClick != null) 
      OnSongButtonClick (index); 
    } 

    public Button button; 
    public Text songName; 
    public int unlocked; 
    public AudioClip clip; 
    public int index; 

    void Start() { 
     button.onClick.AddListener (ClickSongButton); 
    } 

    public void Initialize(int index,Song song){ 
     this.index = index; 
     songName.text = song.songName; 
     unlocked = song.unlocked; 
     clip = song.clip; 
     button.interactable = song.isInteractable; 
    } 
} 

Прежде всего, я создаю метод Initialize. Он использует переменные объекта Song для инициализации и принимает индекс как идентификатор кнопки. После создания события для уведомления слушателей с индексом.

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using System.Collections.Generic; 

[System.Serializable] 
public class Song 
{ 
    public string songName; 
    public int unlocked; 
    public bool isInteractable; 
    public AudioClip clip; 
} 

public class SongManager : MonoBehaviour 
{ 

    public SongButton button; 
    public Transform panel; 
    public List<Song> songList; 

    void OnEnable(){ 
     SongButton.OnSongButtonClick += SongButton_OnSongButtonClick; 
    } 

    void OnDisable(){ 
     SongButton.OnSongButtonClick -= SongButton_OnSongButtonClick; 
    } 

    void SongButton_OnSongButtonClick (int index) 
    { 
     Debug.Log ("index : " + index + " - song name : " + songList [index].songName); 
    } 

    void Start() 
    { 
     FillList();  
    } 

    void FillList() 
    { 
     for (int i = 0; i < songList.Count; i++) { 
      SongButton songButton = Instantiate (button) as SongButton; 
      songButton.Initialize (i, songList [i]); 
      songButton.transform.SetParent (panel, false); 
     } 
    } 
} 

Когда SongManager стал включен, он начинает прослушивать события OnSongButtonClick. Таким образом, вы можете узнать, какая кнопка нажата.

Надеюсь, это поможет.

0

Вы передаете имя функции для параметра AddListener.

public GameObject go; 
Button myButton = null; 

void Start() 
{ 
    myButton = go.GetComponent<Button>(); 
    myButton.onClick.AddListener(() => myCallBackFunction()); 
} 

void myCallBackFunction() 
{ 
    Debug.Log("Button Clicked!"); 
} 

Вы также можете сделать: myButton.onClick.AddListener(delegate { myCallBackFunction(); });

Примечание:

Пожалуйста, разместить свой код в следующий раз вместо размещения скриншот него.

+0

или просто myButton.onClick.AddListener (myCallBackFunction); это проще. – luizcarlosfx

+0

@luizcarlosfx Да, это проще. Я обычно иду с этими двумя, потому что они позволяют вам выполнять пользовательскую функцию с ** параметром **. Скажем, кнопка, сгенерированная в цикле 'for' для некоторого динамического интерфейса. Тот, кто в вашем комментарии, не может этого сделать. – Programmer

+0

Да, но в большинстве случаев я предпочитаю делать это именно так. Вы также можете создать функцию без параметров и просто использовать ее, чтобы делать все, что хотите. Я читаю больше. – luizcarlosfx