[UGUI]你说UnityEngine.UI.Button是怎么通过拖动来增加OnClick的监听器的呢?

一.写在前面

按国际惯例,先来讲一讲怎么涉及到这里了.我希望一个UI模块在Awake场景加载之后就可以通过回调来响应服务器消息,但是因为这个模块在场景加载的时候并不会被激活,所以需要将事件的订阅提前到该模块被加载之前,这就让我想起来了UGUI的Button的onClick事件,既然如此那就让我们一起来发现真相把.

二.真相就在这里!

首先呢,UGUI是开源的,要看源码啊,就不得不推荐Resharper了,这个插件有一个Assembly Explorer的东西,可以看到dll中的内容.下面就是Button的源码.我们看到,Button的onClick是一个继承了UnityEvent的对象,而这个对象是被标记了"[Serializable]"的,表示这个对象可以被序列话,而根据UnityEvent,则我们的目的就达到了.

 1 // Decompiled with JetBrains decompiler
 2 // Type: UnityEngine.UI.Button
 3 // Assembly: UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 4 // MVID: FFDB3AB2-A87C-4B43-B613-BCF0D7807E81
 5 // Assembly location: D:\practice\TaiDouARPG\Library\UnityAssemblies\UnityEngine.UI.dll
 6
 7 using System;
 8 using System.Collections;
 9 using System.Diagnostics;
10 using UnityEngine;
11 using UnityEngine.Events;
12 using UnityEngine.EventSystems;
13 using UnityEngine.Serialization;
14
15 namespace UnityEngine.UI
16 {
17   [AddComponentMenu("UI/Button", 30)]
18   public class Button : Selectable, IEventSystemHandler, IPointerClickHandler, ISubmitHandler
19   {
20     [SerializeField]
21     [FormerlySerializedAs("onClick")]
22     private Button.ButtonClickedEvent m_OnClick = new Button.ButtonClickedEvent();
23
24     public Button.ButtonClickedEvent onClick
25     {
26       get
27       {
28         return this.m_OnClick;
29       }
30       set
31       {
32         this.m_OnClick = value;
33       }
34     }
35
36     protected Button()
37     {
38     }
39
40     private void Press()
41     {
42       if (!this.IsActive() || !this.IsInteractable())
43         return;
44       this.m_OnClick.Invoke();
45     }
46
47     public virtual void OnPointerClick(PointerEventData eventData)
48     {
49       if (eventData.button != PointerEventData.InputButton.Left)
50         return;
51       this.Press();
52     }
53
54     public virtual void OnSubmit(BaseEventData eventData)
55     {
56       this.Press();
57       if (!this.IsActive() || !this.IsInteractable())
58         return;
59       this.DoStateTransition(Selectable.SelectionState.Pressed, false);
60       this.StartCoroutine(this.OnFinishSubmit());
61     }
62
63     [DebuggerHidden]
64     private IEnumerator OnFinishSubmit()
65     {
66       // ISSUE: object of a compiler-generated type is created
67       return (IEnumerator) new Button.\u003COnFinishSubmit\u003Ec__Iterator1()
68       {
69         \u003C\u003Ef__this = this
70       };
71     }
72
73     [Serializable]
74     public class ButtonClickedEvent : UnityEvent
75     {
76     }
77   }
78 }

三.总结

其实这篇博客还没写完,为什么可以这样搞还没弄明白,等以后更新吧.

时间: 2024-08-28 12:45:37

[UGUI]你说UnityEngine.UI.Button是怎么通过拖动来增加OnClick的监听器的呢?的相关文章

uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/42705885 uGUI出来这么久了,也一直没好好用用,主要是公司项目不用U3D.昨晚用了下Button,还是比较爽的. 主要说下用代码添加button.OnClick()事件的方法(使用属性面板添加的方法就不说了) 一.创建2D UI Panel,添加你需要的Button. 我添加了3个Button:BtnSt

ugui使用代码动态添加Button.OnClick()事件

using UnityEngine;using UnityEngine.UI;using System.Collections;using UnityEngine.Events;using System.Collections.Generic; public class PersonalInformation : MonoBehaviour{ void Start()    {        List<string> BtnsName = new List<string>();  

unity5, UI Button &quot;On Button Down&quot;

unity5自带的UI Button的Inspector面板中只有On Click事件,如果我们想让一个按钮响应On Button Down事件该怎么办呢?方法是: 点Add Component->Event->Event Trigger添加一个Event Trigger组件.然后再点Add New Event Type->PointerDown.就得到"On Button Down"事件了. 参考:http://stackoverflow.com/questions

unity5,UI Button too small on device than in Game View解决办法

假设测试设备为iphone5(横屏).下面说明如何使真机上ui显示效果与Game View中一致. 1,首先Game View左上角屏幕规格选 iPhone 5 Wide (16:9),如图: 2,在Hierarchy中选择Canvas,进入其Inspector面板,将其中Ui Scale Mode由Constant Pixel Size改为Scale With Screen Size,并将Reference Resolution改为iPhone5(横屏)的分辨率 X:1136,Y:640,如图

UGUI 特效怎样在UI上裁剪

刚好碰到有人问怎样把粒子特效放到 UI 上并且能正确被 Mask 裁剪, 首先想到给粒子效果的 Shader 添加模板模仿一般 UI 的模板方式, 应该就能正确裁剪了吧, 不过没那么简单, 我们看到在一般 UI 上, 没在 Mask 下的 UI 对比在 Mask 下的 UI, 它们的材质设置是不一样的, 也就是说有哪个组件对材质进行了修改, 查了一下就是 Mask 组件, 它会收集子节点下的所有对象, 然后对可以修改的材质进行修改, 所以才能自动控制裁剪. 为了搞清楚, 这里做了一下测试: 1.

Unity5UGUI 官方教程学习笔记(三)UI BUTTON

Button Interactable :为了避免与该按钮产生交互,可以设置它为false Transition: 管理按钮在正常情况 ,按下,经过时的显示状态  None  按钮整正常工作 但是在按下等情况下 没有任何显示 ColorTint  为颜色    Color Multiplier 颜色乘数 每个按钮的色调 Fade Duration 淡出时间(秒)  所需的状态之间转换 SpriteSwap  为图片 Animation   动画  可以点击Auto Generate  Anima

iOS开发UI—Button基础

iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状态 normal(普通状态) 默认情况(Default) 对应的枚举常量:UIControlStateNormal highlighted(高亮状态) 按钮被按下去的时候(手指还未松开) 对应的枚举常量:UIControlStateHighlighted disabled(失效状态,不可用状态) 如

UI Button

iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状态 normal(普通状态) 默认情况(Default) 对应的枚举常量:UIControlStateNormal highlighted(高亮状态) 按钮被按下去的时候(手指还未松开) 对应的枚举常量:UIControlStateHighlighted disabled(失效状态,不可用状态) 如

uGUI练习(二) Animate UI

一.步骤 1.创建一个Panel,下面再创建两个子Panel 2.修改Canvas的 Render Mode为Screen Space-Camer 3.为每个Panel下添加一个Button 4.转动父Panel的Rotation的Y值,观察Scene和Game视图 5.通过Unity的Animation工具,录制Panel的Rotation动画 6.录制好动画之后,创建Animation Controller,设置一个空的动画为默认动画 7.设置Panel1和Panel2的Button的On