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. 欢迎广大读者围观

  • 相关阅读:
    JavaWeb(一)
    有趣的天平秤假币问题
    栈应用——逆波兰式表达式的值
    栈应用——最长括号匹配
    倾力总结40条常见的移动端Web页面问题解决方案
    Emmet:HTML/CSS代码快速编写神器
    我的 Github 个人博客是怎样炼成的
    解决mac下atom安装插件失败问题
    Github建站全攻略
    OS X快捷键最最齐全版(官方版)
  • 原文地址:https://www.cnblogs.com/zou90512/p/3995932.html
Copyright © 2011-2022 走看看