Unity 实现给物体动态添加事件

介绍一个方法给物体动态的添加事件(点击 拖拽等)

using System.Events;
using System.EventSystems;
//_go is the gameobject which need add event
//_go 是物体,因为EventTrigger是unity中的一个组件,我们要用添加组件的方式来给物体添加事件触发组件
//_type is the EventTriggerType(point , drag , clickdown......
//_type 是要添加的事件触发类型,这是一个内置枚举
//_action is the funtion
//_action 这里之前写的时候可能是没有注意就写上了funtion了,其实这应该是一个委托一个UnityAction类型的委托
void AddTriggerEvent (GameObject _go , EventTriggrtType _type , UnityAction<BaseEventData> _action)
{
        // 查看是否已经有这个组件
        EventTrigger trigger = _go.GetComponent<EventTrigger>();
        // 如果没有就添加组件
        if (trigger == null)
        {
            trigger = _go.AddComponent<EventTrigger>();
        }
        //2021年2月20日更新
        //没有必要加这句话,因为你使用的只是一个引用,并不是属性
        //if (trigger.triggers.Count==0)
        //{
        //    trigger.triggers = new List<EventTrigger.Entry>();
        //}
        //新建触发实例
        EventTrigger.Entry entry = new EventTrigger.Entry();
        // 之前我在项目里写的时候是直接添加的方法,没有用传值的方式,所以这里写的有些累赘
        //UnityAction<BaseEventData> callBack = new UnityAction<BaseEventData>(_action);

        // 修改之前累赘写法
        //entry.callback.AddListener(callBack);
        entry.callback.AddListener(_action);
        //设置实例类型
        entry.eventID = _type;
        // 将实例添加到触发列表中
        trigger.triggers.Add(entry);
}

2021年2月20日更新

看到自己之前写的博客太过简略,也没有注意事项,重新编辑一下,我现在重新加上了注释,对脚本进行了部分修改,然后下面讲一下注意事项

1.这个事件触发是使用的unity内置的事件触发系统,所以在使用的时候一定要有

这两个组件,就是你在场景里新建UI组件的时候自己新建的那个东西

2.如果是UI的话,可以直接添加,但如果不是UI的话,确保两件事

1) 确保相机上有射线组件

这两个组件分别对应3D物体和2D物体

2)要被检测的组件一定要有collder组件

只有这样才能保证eventtrigger的正确实现

补充:Unity 动态给物体添加EventTrigger事件

给挂载该脚本的物体自动添加 EventTrigger 组件:

[RequireComponent(typeof(EventTrigger))]
public class ModelComponent : MonoBehaviour
{
}

给物体动态添加 EventTrigger 的触发事件:

private  void AddEventTriggerFun(EventTriggerType eventTriggerType, UnityEngine.Events.UnityAction<BaseEventData> unityAction)
{
      // 定义所要绑定的事件类型
      EventTrigger.Entry entry = new EventTrigger.Entry();
      // 设置事件类型
      entry.eventID = eventTriggerType;
      // 初始化回调函数
      entry.callback = new EventTrigger.TriggerEvent();
      // 定义回调函数
       UnityEngine.Events.UnityAction<BaseEventData> callBack = new UnityEngine.Events.UnityAction<BaseEventData>(unityAction);
      // 绑定回调函数
      entry.callback.AddListener(callBack);
      eventTrigger.triggers.Add(entry);
}

调用测试:

private EventTrigger eventTrigger;
private void Start()
{
    eventTrigger = GetComponent<EventTrigger>();
    EventTest();
}
private void EventTest()
{
    AddEventTriggerFun(EventTriggerType.PointerClick, (BaseEventData baseEventData) => { ClickEvent(); });
}
private void ClickEvent()
{
   Debug.Log("点击事件绑定成功...");
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity 如何批量修改FBX模型

    由于模型数量有点多,并且都要修改参数,还有从里面提取动画.就搜搜查查,搞了个小工具,批量的修改 FBX 模型的 参数,以及提取动画相关. using UnityEditor; using UnityEngine; using System.IO; using System.Collections; using System.Collections.Generic; public class ModifyMoidel : Editor { [MenuItem("BenBen/修改模型ModelSc

  • Unity中EventTrigger的几种使用操作

    说起EventTrigger事件触发器,它的使用可以说是无处不在,EventTrigger继承了很多的事件接口,这些接口对我们开发是十分有用的. 弄懂EventTrigger在以后开发游戏过程中可以说是事半功倍. namespace UnityEngine.EventSystems { [AddComponentMenu ("Event/Event Trigger")] public class EventTrigger : MonoBehaviour, IEventSystemHan

  • Unity 修改FBX模型动画的操作

    如何在Unity里修改FBX模型自带的动画 我们在把模型做成预制体的时候会出现,模型当前看到的位置和动画播放的位置不一致,而且模型动画文件又是只能读不能改 就这种情况 修改办法 选择模型的动画文件按Ctrl+D复制一份出来再修改就行了,然后在重新引用复制出来的新动画文件 补充:unity中对导入的FBX动画进行重新编辑 在unity中,当我们打开一个fbx自带的动画的时候,会发现动画的关键帧视灰色的,在动画的名字后面有(read-only)的字样,我们没有办法对fbx的动画进行重新编辑,在某些情

  • unity 如何判断鼠标是否在哪个UI上(两种方法)

    第一种 可以得到UI,再根据名字判断是不是自己自己要点击的UI 其中参数canvas拖入此UI的canvas /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { Poin

  • Unity 如何设定 Animator分割播放

    项目有个需求,一整段非常长的Animator 动画, 分割成一份份的播放,我们点击相应的按钮就播放某个时间点的动画,废话不多说 新建一个空物体加上toggle group, 下面是一堆的toggle并在Group里加上父亲 private Animator myAnimator; public List<Toggle> myTogglesList; private float playTime; public void Awake() { myAnimator = GameObject.Fin

  • unity中点击某一个按钮播放某一个动作的操作

    1.创建动画控制器,双击打开动画控制器,创建 状态并添加动画片段,并且状态与状态之间进行连线,往返的都要有,在Animator的左上角–Parameters–点击加±-Trigger–命名(要求:第一个状态的名字+To+第二个状态的名字) 2.给状态与状态之间添加参数条件 选中状态与状态之间的线–检视视图上的Condition–点击+号–选择对应的参数条件 3.创建一个Button 切换到2D场景,在层级视图–Create–UI–Button按钮,调整到合适的位置,选中Canvas,把脚本挂上去

  • Unity 按钮事件封装操作(EventTriggerListener)

    我就废话不多说了,大家还是直接看代码吧~ using UnityEngine; using UnityEngine.EventSystems; namespace Mx.UI { public class EventTriggerListener :UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public

  • Unity中3DText显示模糊不清的解决方案

    在Unity中,当我们想要给3D物体一个文字说明时,使用Canvas下的Text虽然也能通过缩放实现,但是实现起来比较麻烦,改动的多,大小和位置也不容易控制. 此时就需要用到我们的3DText了,对于初次使用这个组件的"攻城狮"来说,会发现在Game场景中很模糊 具体修改操作如下: 此时,只需要选中当前3DText的物体,修改TextMesh组件下的Character Size和Font Size两个属性值.例如: 在这里,Character Size值越小,同时Font Size越大

  • Unity 点击UI与点击屏幕冲突的解决方案

    Unity 有点击屏幕进行移动操作,通过Input.GetMouseButtonDown(0).如果点击到了一些UI上面会触发点击屏幕事件. 引入UnityEngine.EventSystems,用函数判断一下即可 using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.EventSystems; public class

  • Unity 实现给物体动态添加事件

    介绍一个方法给物体动态的添加事件(点击 拖拽等) using System.Events; using System.EventSystems; //_go is the gameobject which need add event //_go 是物体,因为EventTrigger是unity中的一个组件,我们要用添加组件的方式来给物体添加事件触发组件 //_type is the EventTriggerType(point , drag , clickdown...... //_type

  • 老生常谈js动态添加事件--- 事件委托

    其所谓的动态添加事件实质就是指js中的事件委托. 我们知道在js中,事件处理只能绑定在当前被选中的元素上,换句话也就是说,事件处理只能绑定在当前文档已经存在的元素上!但是,往往小伙伴们都会遇到一个问题就是,我的元素是后来动态添加到页面的,而我又想给该元素绑定事件,怎么处理? 为了说明白这一问题,我们假设需要给后来添加到当前页面的元素添加click事件. 解决这一问题的核心就是利用js的委托事件.委派事件的优势就是可以给未存在的元素绑定事件,而且委派事件往往开销也会更小! 题外话:举一个最简单的例

  • JavaScript动态添加事件之事件委托

    先给大家讲下什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 也就是:利用冒泡的原理,把事件加到父级上,触发执行效果. 其所谓的动态添加事件实质就是指js中的事件委托. 我们知道在js中,事件处理只能绑定在当前被选中的元素上,换句话也就是说,事件处理只能绑定在当前文档已经存在的元素上!但是,往往小伙伴们都会遇到一个问题就是,我的元素是后来动态

  • 多种方法实现JS动态添加事件

    方法一.setAttribute var obj = document.getElementById("obj"); obj.setAttribute("onclick", "javascript:alert('测试');"); 但是IE不支持用 setAttribute 设置某些属性,包括对象属性.集合属性.事件属性,也就是说用 setAttribute 设置 style.onclick.onmouseover 这些属性在 IE 中是行不通的.

  • JS中动态添加事件(绑定事件)的代码

    两种方式:直接给对象添加事件,节点添加事件 例如给一个id为tab1的添加onclick事件 第一种情况: 复制代码 代码如下: var t = document.getElementById("tab1"); t.onclick = function tst(){ alert(''); } 第二种情况 复制代码 代码如下: var tb = document.getElementById("tab1"); if(window.addEventListener){

  • C#中控件动态添加事件绑定的时机详解

    前言 最近遇到个小问题,要为几十个文本框添加相同的失去焦点事件,常规的办法是在VS的事件管理器里面添加,但那样太繁琐了,几十个文本框,要加几十遍,这行不通. 于是想到动态绑定,第一次尝试如下: foreach(TextBox tbx in tbxs){ tbx.Leave += new EventHandler(tbxN_Leave); } public void tbxN_Leave(object sender, EventArgs e) { MessageBox.Show("Leave&qu

  • javascript 动态添加事件代码

    方法一.setAttribute var obj = document.getElementById("obj"); obj.setAttribute("onclick", "javascript:alert('测试');"); 这里利用 setAttribute 指定 onclick 属性,简单,很好理解, 但是:IE 不支持,IE 并不是不支持 setAttribute 这个函数,而是不支持用 setAttribute 设置某些属性,包括对象

  • js动态添加事件并可传参数示例代码

    复制代码 代码如下: var tt=function(obj) { return function() { alert(obj.tagName); //可以为外部定义的一个执行函数: } } function addfunction() { var bigobj=document.getElementById("mytable"); var rows =bigobj.rows; for(var j=0; j<rows.length; j++) { for(var i=0;i<

  • ASP.NET 页面中动态增加的控件、添加事件第1/2页

    要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone! 提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常! 大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才执行,远远落后于 OnInit阶段,而且ViewState在OnLoad时才准备好,OnInit以及之前的阶段根本就不能使用ViewState!如果试图在按钮点击事件里面创建WebPartZone等控件,唯一的后果就

  • JS实现为动态添加的元素增加事件功能示例【基于事件委托】

    本文实例讲述了JS实现为动态添加的元素增加事件功能.分享给大家供大家参考,具体如下: 我们在日常开发中有时会通过js创建一些元素,但是如果使用原始的for循环给创建的节点添加事件的方法往往行不通: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net js动态添加事件</title>

随机推荐