使用委托 灵活地获取到UI点击了什么按钮 在 button 上添加委托delegate 。可以随时监听到按下的是什么键,然后执行自己想要的方法。
主要使用方法 Main.Instance.message.RegisterReceive(gameObject, Receive);
最简单的。需要4个脚本:
UI按钮下添加ButtonEvent脚本 ,脚本主要是在按钮点击后,添加一个事件,然后发送消息出去,Main脚本是为了只有一个控制中心,StartTest就是调用使用获取到点击了什么按钮
下载链接下载链接
1.MessageControl (消息控制中心)
public delegate void MessageDelegate(string data);
/// <summary>
/// 消息控制中心
/// </summary>
public class MessageControl
{
//创建一个集合存储 谁接收什么委托传递过来的什么消息
private Dictionary<GameObject, MessageDelegate> dict_Messages;
public MessageControl()
{
dict_Messages = new Dictionary<GameObject, MessageDelegate>();
Debug.Log("new成功");
}
/// <summary>
/// 注册添加数据
/// </summary>
/// <param name="go"></param>
/// <param name="data"></param>
public void RegisterReceive(GameObject go, MessageDelegate Handler)
{
Debug.Log("注册获取"+ go+ Handler);
if (dict_Messages == null) return;
if (!dict_Messages.ContainsKey(go)) //如果里面没有就继续添加,如果有就不添加了
{
dict_Messages.Add(go, Handler);
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="data"></param>
public void SendMessage(string data)
{
foreach (var item in dict_Messages)
{
Debug.Log("SendMessage" + item.Value + data);
item.Value.Invoke(data); // Value 是 StartTest Receive()方法 传递到StartTest脚本中
}
}
/// <summary>
/// 移除数据
/// </summary>
/// <param name="go"></param>
public void RemoveReceive(GameObject key)
{
//先判断有没有储存,再判断是否有这个key
if (dict_Messages == null) return;
if (dict_Messages.ContainsKey(key))
{
dict_Messages.Remove(key);
}
}
}
2.ButtonEvent(按钮事件)
// <summary>
/// 脚本挂在Button下面
/// </summary>
[RequireComponent(typeof(Button))]
public class ButtonEvent : MonoBehaviour
{
private string data;
private Button button;
void Start () {
data = name;
button = GetComponent<Button>();
if (button !=null)
{
button.onClick.AddListener(OnClik); //按钮点击一下,就发送一次信息
}
}
public void OnClik()
{
Debug.Log("添加OnClik");
Main.Instance.message.SendMessage( data);
}
}
3.Main (这个脚本主要是 调用 MessageControl 脚本 )
/// <summary>
/// 调用这个脚本去注册
/// </summary>
public class Main : MonoBehaviour {
public MessageControl message;
public static Main Instance;
public void Awake()
{
Instance = this;
message = new MessageControl(); // 脚本从这new ,保证只new一次。
}
}
4.StartTest(挂物体身上)
/// <summary>
/// 测试脚本
/// </summary>
public class StartTest : MonoBehaviour
{
void Start ()
{
Main.Instance.message.RegisterReceive(gameObject, Receive);
}
private void Receive(string data)
{
Debug.Log("这个是"+data);
}
void Desyory()
{
Main.Instance.message.RemoveReceive(gameObject);
}
}