如何通过脚本访问OnClick事件

时间:2016-11-14 11:12:34

标签: user-interface events audio unity3d buttonclick

我正在尝试做一个SongManager对象,它将负责更改歌曲。我创建了一个SongManager和一个Song脚本。在运行时,SongManager会创建尽可能多的歌曲按钮,每个歌曲按钮都有不同的变量。一切似乎工作得很好,除了我无法进入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

2 个答案:

答案 0 :(得分:1)

您可以使用Events与其他课程进行交流。这是代码:

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对象变量进行初始化,并将索引作为按钮ID。在我为具有索引的通知侦听器创建事件之后。

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事件。这样,您就可以知道点击了哪个按钮。

我希望它有所帮助。

答案 1 :(得分:-1)

您将函数名称传递给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(); });

注意:

请在下次发布您的代码,而不是发布截图。