Получить ссылку на функцию для выполнения из инспектора единства для OnClick динамически создаваемой кнопки - PullRequest
0 голосов
/ 13 октября 2018

Я хочу знать, как я могу получить ссылку на определенную функцию в любом другом скрипте через инспектор единства для добавления его в прослушиватель по нажатию динамически создаваемой кнопки.Я пытался открыть общедоступный UnityEvent, чтобы получить ссылку на функции (как в случае щелчка статической кнопки), но я не уверен, как добавить его в прослушиватель по нажатию (button.onClick.AddListener (functionName)), как выглядит слушательдля действия.Есть что-то, что я пропускаю?Или есть другой подход к этому?Благодарю.Это идея -

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

public class DynamicButton : MonoBehaviour
{
    public Button MainButton;
    public GameObject ButtonPrefab;

    [System.Serializable]
    public class ButtonInfo
    {
        public Sprite sprite;
        public UnityEvent ButtonEvent; //take reference to a particular function
    }
    public ButtonInfo[] ButtonCount;

    void Start()
    {
        PlaceButtons();

    }

    void PlaceButtons()
    {

        int NoButton = ButtonCount.Length;

        for (int i = 0; i < NoButton; i++)
        {           
            Vector3 newPos = new Vector3(i*10, i*10,0);   
            GameObject go = Instantiate(ButtonPrefab, newPos, Quaternion.identity);
            go.GetComponent<Image>().sprite = ButtonCount2To6[i].sprite;
            go.GetComponent<Button>().onClick.AddListener();  //This is where I want to add the  particular function that i want to execute when the button is clicked
            go.transform.parent = MainButton.transform;
            go.transform.localPosition = newPos;
        }
    }
}

1 Ответ

0 голосов
/ 13 октября 2018

Что вам нужно сделать, это Invoke событие, а не добавить его к событию onClick.Вам не нужно узнавать / копировать слушателей каждого UnityEvent, но вместо этого достаточно вызвать UnityEvent.UnityEvent затем вызывает всех своих слушателей, которых вы назначили, например, в Инспекторе.Это можно сделать с помощью простой лямбда-функции:

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

public class DynamicButton : MonoBehaviour
{
    public Button MainButton;
    public GameObject ButtonPrefab;

    [Serializable]
    public class ButtonInfo
    {
        public Sprite sprite;
        public UnityEvent ButtonEvent; //take reference to a particular function
    }

    public ButtonInfo[] ButtonCount;

    private void Start()
    {
        PlaceButtons();
    }

    private void PlaceButtons()
    {
        int NoButton = ButtonCount.Length;

        for (int i = 0; i < NoButton; i++)
        {           
            Vector3 newPos = new Vector3(i*10, i*10, 0);   
            GameObject go = Instantiate(ButtonPrefab, newPos, Quaternion.identity);

            // What is ButtonCount2To6?? It probably should rather be ButtonCount[i] ?
            go.GetComponent<Image>().sprite = ButtonCount2To6[i].sprite; 


            // since the lambda will have no acces to i you have to get the reference to the according ButtonInfo first
            var accordingButtonInfo = ButtonCount[i];

            // Add the Invoke call as lambda method to the buttons
            go.GetComponent<Button>().onClick.AddListener(() => {
                accordingButtonInfo .ButtonEvent.Invoke();
            });  

            go.transform.parent = MainButton.transform;
            go.transform.localPosition = newPos;
        }
    }
}

см. Также этот пост

...