Unity中EventTrigger使用

Wesley13
• 阅读 671
  • 在Unity中,点击场景中的模型我们往往需要检测是否点击在了UI上,这时我们需要进行一系列的判断,往往效果还不好,因此我在场景中模型的点击也使用了EventTrigger,EventTrigger我们在UI上的使用比较常见,但是它也可以用于场景点击,并且能屏蔽点击到UI又响应了模型的点击事件,以下是点击事件的组件脚本

    using UnityEngine;
    using UnityEngine.EventSystems;
    public class EventTriggerListener : EventTrigger
    {
        public delegate void VoidDelegate();
        public delegate void EventDelegate(BaseEventData baseEventData);
        public delegate void BoolDelegate(bool state);
        public delegate void FloatDelegate(float delta);
        public delegate void VectorDelegate(Vector2 delta);
        public delegate void ObjectDelegate(GameObject obj);
        public delegate void KeyCodeDelegate(KeyCode key);
    
        public VoidDelegate onClick;
        public EventDelegate onEventClick;
        public VoidDelegate onDown;
        public VoidDelegate onEnter;
        public VoidDelegate onExit;
        public VoidDelegate onUp;
        public VoidDelegate onSelect;
        public VoidDelegate onUpdateSelect;
    
    
        static public EventTriggerListener Add(Transform transform)
        {
            EventTriggerListener listener = transform.GetComponent<EventTriggerListener>();
            if (listener == null)
                listener = transform.gameObject.AddComponent<EventTriggerListener>();
            return listener;
        }
    
        public override void OnPointerClick(PointerEventData eventData)
        {
            if (onClick != null)
            {
                onClick();
            }
            if (onEventClick != null)
            {
                onEventClick(eventData);
            }
        }
    
        public override void OnPointerDown(PointerEventData eventData)
        {
            if (onDown != null)
                onDown();
        }
    
        public override void OnPointerEnter(PointerEventData eventData)
        {
            if (onEnter != null)
                onEnter();
        }
    
        public override void OnPointerExit(PointerEventData eventData)
        {
            if (onExit != null)
                onExit();
        }
    
        public override void OnPointerUp(PointerEventData eventData)
        {
            if (onUp != null)
                onUp();
        }
    
        public override void OnSelect(BaseEventData eventData)
        {
            if (onSelect != null)
                onSelect();
        }
    
        public override void OnUpdateSelected(BaseEventData eventData)
        {
            if (onUpdateSelect != null)
                onUpdateSelect();
        }
    }
    
  • 使用方法,只需要在模型对象上挂在脚本,该脚本注册下上面的脚本事件。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class EnvironmentClick : MonoBehaviour
    {
        private void Awake()
        {
            EventTriggerListener.Add(transform).onEventClick += OnGroundClick;
        }
       public void OnGroundClick(BaseEventData data)
        {
            if (Input.GetMouseButton(1)) return;
            if (Input.GetMouseButton(2)) return;
    
           //do something
    
        } 
        
    }
    
点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
FlutterDojo设计之道—状态管理之路(七)
Provider在列表中使用在前面的讲解中,我们大部分的场景都是在普通的Box布局中,相信大家对Provider的使用已经非常清楚了,下面来看下在List中的使用场景,相信对于很多App来说,列表应该是大部分页面的核心UI,所以,到底如何在列表的「下拉刷新」、「上拉加载更多」、「Item点击修改状态」这几种场景下来使用Pro
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
IOS中键盘自动隐藏
前言很多时候当我们在一个文本框中输入信息后,按了确认或者返回键需要隐藏键盘,或者在其他空白区域点击屏幕后也需要隐藏屏幕。这时肯定就需要让相应的控件响应Tap事件(点击事件),这样我们才能处理。实现隐藏的两种方法在IOS中有一个概念叫FirstResponder,意指第一响应者,也就是当前屏幕上,处于焦点状态的控件,它是第一响
Wesley13 Wesley13
3年前
DOM元素的自动隐藏
在一些有悬浮元素的场景中,比如点击一个按钮弹出菜单后,点击菜单以外的地方,菜单应该被隐藏起来。隐藏的方式最好是自动隐藏,或至少是组件内的自动隐藏。蒙层比如,一个模态框组件(闭包实现)点击蒙层时,响应蒙层的点击事件,可以在事件处理函数中隐藏整个组件。在Vue和React等框架的组件中,这一点非常容易实现。<divclass"com
Wesley13 Wesley13
3年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A