欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Unity中EventTrigger的几种使用操作

程序员文章站 2022-06-18 11:05:46
说起eventtrigger事件触发器,它的使用可以说是无处不在,eventtrigger继承了很多的事件接口,这些接口对我们开发是十分有用的。弄懂eventtrigger在以后开发游戏过程中可以说是...

说起eventtrigger事件触发器,它的使用可以说是无处不在,eventtrigger继承了很多的事件接口,这些接口对我们开发是十分有用的。

弄懂eventtrigger在以后开发游戏过程中可以说是事半功倍。

namespace unityengine.eventsystems
{
    [addcomponentmenu ("event/event trigger")]
    public class eventtrigger : monobehaviour, ieventsystemhandler, ipointerenterhandler, ipointerexithandler, ipointerdownhandler, ipointeruphandler, ipointerclickhandler, ibegindraghandler, iinitializepotentialdraghandler, idraghandler, ienddraghandler, idrophandler, iscrollhandler, iupdateselectedhandler, iselecthandler, ideselecthandler, imovehandler, isubmithandler, icancelhandler
    {
        //
        // fields
        //
        [obsolete ("please use triggers instead (unityupgradable) -> triggers", true)]
        public list<eventtrigger.entry> delegates;
        //
        // properties
        //
        public list<eventtrigger.entry> triggers {
            get;
            set;
        }
        //
        // constructors
        //
        protected eventtrigger ();
        //
        // methods
        //
        private void execute (eventtriggertype id, baseeventdata eventdata);
        public virtual void onbegindrag (pointereventdata eventdata);
        public virtual void oncancel (baseeventdata eventdata);
        public virtual void ondeselect (baseeventdata eventdata);
        public virtual void ondrag (pointereventdata eventdata);
        public virtual void ondrop (pointereventdata eventdata);
        public virtual void onenddrag (pointereventdata eventdata);
        public virtual void oninitializepotentialdrag (pointereventdata eventdata);
        public virtual void onmove (axiseventdata eventdata);
        public virtual void onpointerclick (pointereventdata eventdata);
        public virtual void onpointerdown (pointereventdata eventdata);
        public virtual void onpointerenter (pointereventdata eventdata);
        public virtual void onpointerexit (pointereventdata eventdata);
        public virtual void onpointerup (pointereventdata eventdata);
        public virtual void onscroll (pointereventdata eventdata);
        public virtual void onselect (baseeventdata eventdata);
        public virtual void onsubmit (baseeventdata eventdata);
        public virtual void onupdateselected (baseeventdata eventdata);
        //
        // nested types
        //
        [serializable]
        public class entry
        {
            public eventtriggertype eventid;
            public eventtrigger.triggerevent callback;
            public entry ();
        }
        [serializable]
        public class triggerevent : unityevent<baseeventdata>
        {
            public triggerevent ();
        }
    }
}

这是官方的api中的类,

接下来用不同的方式来看eventtrigger的用法:

1.通过编辑器中添加

在inspector中添加eventtrigger的componnent组件,然后点击add new event type按钮添加一个基本的事件,主基本事件如下图:

Unity中EventTrigger的几种使用操作

当我们选择一个事件的时候,就相当于将要于此事件绑定了,例如当我们选择pointer click的时候,绑定了这个组件的物体将接受pointer click 事件的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现pointer enter,pointer exit等事件的触发)这里我们用来绑定这个eventtrigger 的是一个ui panel 这样便可以让它接受我们自定义的单击事件了

Unity中EventTrigger的几种使用操作

这里的1是我们之前选择的pointer click 事件,2处是将我们3处要执行我们想要的触发函数所在脚本的gameobject托入这里,然后才能选择这个gameobject对象上的脚本来执行,当点击了panel的时候就会触发myclick这个函数(这是我们自定义的函数),编辑器中的方法基本就是这样了。

2.接下来便是如何在脚本中实现刚才的功能

using unityengine;
using system.collections;
using system.collections.generic;using unityengine.events;
using unityengine.eventsystems;
public class gamemanager : monobehaviour {
        void start()
        {
                unityaction<baseeventdata> click = new unityaction<baseeventdata> (myclick);
                eventtrigger.entry myclick = new eventtrigger.entry ();
                myclick.eventid = eventtriggertype.pointerclick;
                myclick.callback.addlistener (click);
                eventtrigger trigger = gameobject.addcomponent<eventtrigger> ();
                trigger.triggers.add (myclick);
        }
        public void myclick(baseeventdata data)
        {
                debug.log ("点击");
        }}

将这个脚本添加到panel上面,然后运行,点击panel,便打印出了“点击”。

补充:unity中使用eventtrigger点击场景中的物体

突然发现,原来以为做一遍以为就不会忘记的东西慢慢就忘了,看来随着年龄的增大记忆力还是慢慢不如从前 了。那就勤动手,把一些需要的东西记下来吧。

今天使用unity的eventtrigger组件,实现点击3d物体。

使用unity版本:5.4

按照记忆中的方法首先添加事件:

 eventtrigger et = gameobject.getcomponent<eventtrigger>();
 if (et == null)
 {
     et = gameobject.addcomponent<eventtrigger>();
 }
 et.triggers = new list<eventtrigger.entry>();
 eventtrigger.entry enter = new eventtrigger.entry();
 enter.eventid = eventtriggertype.pointerdown;
 enter.callback = new eventtrigger.triggerevent();
 unityaction<baseeventdata> callback = new unityaction<baseeventdata>(onpointerdown);
 enter.callback.addlistener(callback);
 et.triggers.add(enter);

然后我们在onpointerdown方法中加一个输出,方便测试:

    void onpointerdown(baseeventdata data)
    {
 debug.logerror("onpointerdown");
    }

面板上已经有eventsystem,然而经过测试,点击无效,测试点击ui没问题

此时才发现是相机上漏加physics raycaster脚本,添加之后,点击测试正常。

看来以后还得多动手,需要的便记下来。

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

相关标签: Unity EventTrigger