UI事件

原理: 内核大探究

 https://blog.csdn.net/ecidevilin/article/details/52503595

事件系统:

EventSystem: UIbehaviour: MonoBehaviour:Behaviour:Component:Object  

(UIbehaviour 基本没有扩展MonoBehaviou中的基础事件方法)

输入模式类:

BaseInputModle : Uibehaviour

 

PointerInputModule  Inherits from:EventSystems.BaseInputModule

 

 

StandaloneInputModule Inherits from:EventSystems.PointerInputModule

TouchInputModule Inherits from:EventSystems.PointerInputModule

 

数据类:

PointerEventDate:BaseEventDate:AbstractEventDate

AxiseventData:BaseEventDate:AbstractEventDate

事件触发:

 

 EventTrigger

class in UnityEngine.EventSystems

/

Inherits from:MonoBehaviour

Other Versions

Leave feedback

 

Implements interfaces:IBeginDragHandlerICancelHandlerIDeselectHandlerIDragHandlerIDropHandlerIEndDragHandlerIEventSystemHandler,IInitializePotentialDragHandlerIMoveHandlerIPointerClickHandlerIPointerDownHandlerIPointerEnterHandlerIPointerExitHandlerIPointerUpHandler,IScrollHandlerISelectHandlerISubmitHandlerIUpdateSelectedHandler

 

 

 

 

 

 

射线检测:

   BaseRaycaster

class in UnityEngine.EventSystems

/

Inherits from:EventSystems.UIBehaviour

Other Versions

Leave feedback.

 


  PhysicsRaycaster

 

class in UnityEngine.EventSystems

/

Inherits from:EventSystems.BaseRaycaster

 

 

 

 

 

         

 

 

 

 

 

 

 

 

  Physics2DRaycaster

class in UnityEngine.EventSystems

/

Inherits from:EventSystems.PhysicsRaycaster

 

 

   ui的事件系统是 monobehaviour 中扩展出来的,事件系统是射线检测,数据存储

    

触发:

Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值。如下图所示:

    先以PointerClick为例。这个是用于某点点击事件。其他事件都可以根据相同的办法调用。

    之所以使用PointerClick为例。是因为在最后笔者会提到一个特殊的实现方式。而相比于其他事件类型,有且仅有Click事件存在特殊实现。

    我们要实现事件主要有3种方式:

    方式一:继承基础接口实现

    步骤一:创建ClickObject脚本。继承MonoBehaviour和IPointerClickHandler。

    

    步骤二:实现public void OnPointerClick(PointerEventData eventData)方法:

    步骤三:创建一个名为Panel_IPointer的空对象。并且将ClickObject脚本附加到对象上。

    步骤四:启动,并点击Panel_IPointer对象。在Console输出如下:

 

    方式二:Unity3D编辑器操作设置实现

    

步骤一:创建一个C#脚本。在脚本中添加一个public方法。

步骤二:创建一个命名为Empty的UI对象,用于接收和响应点击事件。创建一个名为Panel的UI对象,用于触发点击事件。

 

步骤三:Panel对象添加EventTrigger组件," Add New" -> 选择" PointerClick"。将Empty对象拖拽到触发者位置。然后点击"No Function"选择我们写在Test脚本中的OnTestClick事件。

 

    步骤四:设置好这些之后。我们的事件触发就已经完成了。运行Unity3D。点击窗口中Panel对象。Console输出内容如下:

    方式三:程序动态设置实现

    我们在日常的开发中。可能需要动态的需要变更绑定的事件。那么我们如何才能使用C#代码控制绑定触发事件呢?

    下面我们就介绍代码控制。ScriptControl.cs脚本

复制代码

 1 using System.Collections.Generic;
 2 using UnityEngine;
 3 using UnityEngine.Events;
 4 using UnityEngine.EventSystems;
 5 
 6 public class ScriptControl : MonoBehaviour {
 7 
 8     // Use this for initialization
 9     void Start ()
10     {
11         var trigger = transform.gameObject.GetComponent<EventTrigger>();
12         if (trigger == null)
13             trigger = transform.gameObject.AddComponent<EventTrigger>();
14 
15         // 实例化delegates
16         trigger.delegates = new List<EventTrigger.Entry>();
17 
18         // 定义需要绑定的事件类型。并设置回调函数
19         EventTrigger.Entry entry = new EventTrigger.Entry();
20         // 设置 事件类型
21         entry.eventID = EventTriggerType.PointerClick;
22         // 设置回调函数
23         entry.callback = new EventTrigger.TriggerEvent();
24         UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(OnScriptControll);
25         entry.callback.AddListener(callback);
26         // 添加事件触发记录到GameObject的事件触发组件
27         trigger.delegates.Add(entry);
28     }
29     
30     // Update is called once per frame
31     void Update () {
32     
33     }
34 
35     public void OnScriptControll(BaseEventData arg0)
36     {
37         Debug.Log("Test Click");
38     }
39 
40 }

复制代码

    点击事件的特殊实现方式:使用Button控件实现

    

    针对Click事件还存在一种特殊方式:uGUI系统中官方提供了一种Button控件。Button封装了官方提供的一套OnClick事件。操作完全类似于方式二。便不详述了。

    

    使用Button我们可以实现动态的变更鼠标绑定的点击事件。如下代码所示:

复制代码

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.UI;
 4 
 5 public class BtnControl : MonoBehaviour {
 6 
 7     // Use this for initialization
 8     void Start ()
 9     {
10         var button = transform.gameObject.GetComponent<Button>();
11         if (button != null)
12         {
13             button.onClick.RemoveAllListeners();
14             button.onClick.AddListener(TestClick);
15         }
16     }
17 
18     public void TestClick()
19     {
20         Debug.Log("Test Click. This is Type 4");
21     }
22     
23     // Update is called once per frame
24     void Update () {
25         
26     }
27 }

class in UnityEngine.EventSystems

/

Inherits from:EventSystems.BaseInputModule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值