zoukankan      html  css  js  c++  java
  • Unity3D中uGUI事件系统简述及使用方法总结

        

        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 }

        

        相关源码下载: http://pan.baidu.com/s/1c0pfNJM

        

     

    作者:TinyZ
    出处:http://www.cnblogs.com/zou90512/
    关于作者:努力学习,天天向上。不断探索学习,提升自身价值。记录经验分享。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
    如有问题,可以通过 zou90512@126.com 联系我,非常感谢。
    笔者网店: shop70768633.taobao.com. 欢迎广大读者围观

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/zou90512/p/3995932.html
Copyright © 2011-2022 走看看