Unity中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按钮添加一个基本的事件,主基本事件如下图:
当我们选择一个事件的时候,就相当于将要于此事件绑定了,例如当我们选择pointer click的时候,绑定了这个组件的物体将接受pointer click 事件的消息,当我们在物体上按下鼠标的时候,(当然空间中的物体我们是无法通过鼠标点击的,但是当我们可以通过射线碰撞的方法,来实现pointer enter,pointer exit等事件的触发)这里我们用来绑定这个eventtrigger 的是一个ui panel 这样便可以让它接受我们自定义的单击事件了
这里的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脚本,添加之后,点击测试正常。
看来以后还得多动手,需要的便记下来。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
上一篇: AmazeUI 网格的实现示例
推荐阅读