Unity中多个Button使用同一个点击事件时如何获取到本次点击的是哪一个Button

在Unity开发过程中,经常会遇到多个Button使用同一个点击事件的情况,在这种情况下有时我们需要对本次点击的按钮进行一系列操作或者根据本次点击的按钮来执行一些事件。那么首先我们需要做的就是获取到本次点击的按钮对象。

我自己常用的有两种方法。

首先,我们需要一个List来将我们的按钮管理起来,这样做会方便对每一个按钮进行操作。

public List<Button> buttons = new List<Button>();//通过外部拖入或者动态获取来将按钮添加到List中

接下来,分别定义两种点击事件:

点击方法一:

   //第一种点击方法
    void ClickEvent1()
    {
        //通过 UnityEngine.EventSystems的底层来获取到当前点击的对象
        var button = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject;
        Debug.Log(button.name);
    }

点击方法二:

  //第二种点击方法
    void ClickEvent2(int a)
    {
        Debug.Log(buttons[a].name);
    }

大家可以看到,方法一是一个无参的方法,方法二是一个有参方法,那么在为按钮添加事件是,添加的方式略有不同:

添加一:

 void AddClickEvents()
    {
        foreach (Button item in buttons)
        {
            item.onClick.AddListener(ClickEvent1);
        }
    }

直接添加,就可以在点击时获取到本次点击的Button;

添加二:

    void AddClickEvents()
    {
        int x = 0;
        foreach (Button item in buttons)
        {
            int y = x;
            item.onClick.AddListener(()=>ClickEvent2(y));
            x++;
        }
    }

若使用第二种方法,在添加事件时要注意,不论是使用foreach遍历还是使用for循环来添加,不可以直接将x或者for循环的i作为点击事件的参数来传入。

因为button.onClick.AddListener(()=>ClickEvent2(y))的原理是使用委托来实现的,这里传入的方法的参数是一个引用,如果这个引用的值发生了变化,那么在你点击时用到的将是变化后的值,所以我们需要每次循环都重新声明一个局部的int变量来储存每次的循环的int值来作为一个参数传入。

在按照这个方法为按钮进行添加事件之后,我们就可以根据传入的int参数和list中的index来获取到本次点击的是哪一个按钮了。

下面附上本人制作的一个小demo。

代码:

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

public class ButtonMgr : MonoBehaviour
{

    public List<Button> buttons = new List<Button>();
    void Start()
    {
        AddClickEvents();
    }


    void AddClickEvents()
    {
        int x = 0;
        foreach (Button item in buttons)
        {
            int y = x;
            item.onClick.AddListener(()=>ClickEvent2(y));
            x++;
        }
    }

    //第一种点击方法
    void ClickEvent1()
    {
        //通过 UnityEngine.EventSystems的底层来获取到当前点击的对象
        var button = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject;
        Debug.Log(button.name);
    }
    //第二种点击方法
    void ClickEvent2(int a)
    {
        Debug.Log(buttons[a].name);
    }
}

 在场景里实例化三个按钮,起三个不同的名字,并按顺序将button添加到list中,然后运行起来,从左到右依次点击三个button,观察console日志可以看到现象是正确的。

如果使用第一种方法,在添加事件时只需要把AddClickEvents方法稍作修改就好了:


    void AddClickEvents()
    {
        foreach (Button item in buttons)
        {
            item.onClick.AddListener(ClickEvent1);
        }
    }

这两个方法都可以获取到本次点击的button对象,只要能拿到对象,相信大家想要做什么更进一步的操作就方便多了。

猜你喜欢

转载自blog.csdn.net/weixin_43818160/article/details/99739265