分享

Unity

 kiki的号 2017-04-07

Event System


组成


系统生成的Event System里面主要有两个Components,分别是Event System和Standalone Input Module。



其中Standalone Input Module是派生自BaseInputModule。







作用


1. EventSystem


负责处理输入、射线投射以及发送事件



一个场景中只能有一个EventSystem,否则EventSystem会失效



2. BaseInputModule


负责处理输入(点击、拖拽等),把输入事件发送到具体的对象


3. BaseRaycaster


负责确定目标对象



在UI中:就是GraphicRaycaster

非UI中:就需要自己在摄像机上绑定并且检测对象上要有Collider



小结


EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象。








工作流



  1. BaseInputModule接收用户的输入

  2. BaseRaycaster根据用户的输入,找到目标物体

  3. 根据用户的输入事件,调用目标物体上的对应接口实现。


内部工作机制



  1. EventSystem把其GameObject上的所有BaseInputModule放到一个内部列表中。

  2. 在每一帧调用UpdateModules方法,该方法会去调用列表中所有BaseInputModule的UpdateModule方法。

  3. 在UpdateModule方法中,BaseInputModule会把自己的状态修改为"Updated",之后BaseInputModule的Process接口才会被调用








事件



事件都必须在对象内操作才会发生



拖拉事件





































接口事件作用注意事项
IBeginDragHandlerOnBeginDrag开始拖拉必须同时实现IDragHandler,否则失效
IDragHandlerOnDrag正在拖拉每当移动一定距离,就发生一次拖拉事件
IEndDragHandlerOnEndDrag结束拖拉必须同时实现IDragHandler,否则失效
IInitializePotentialDragHandlerOnInitializePotentialDrag可能发生拖拉必须同时实现IDragHandler。在对象内点击就会发生

点击事件











































接口事件作用注意事项
IPointerEnterHandlerOnPointerEnter鼠标进入对象
IPointerExitHandlerOnPointerExit鼠标离开对象
IPointerDownHandlerOnPointerDown按下鼠标
IPointerClickHandlerOnPointerClick点击中该对象在OnPointerUp后发生
IPointerUpHandlerOnPointerUp松开鼠标

其他事件





























































接口事件作用注意事项
IScrollHandlerOnScroll操作鼠标中间的滚轮
ISelectHandlerOnSelect当EventSystem选中该对象使用EventSystem中的SetSelectedGameObject方法来选中
IDeselectHandlerOnDeselect不再选中该对象点击对象外的地方就会变成不选中
IUpdateSelectedHandlerOnUpdateSelected当对象被选中,则每帧都会发生对象被选中才会发生
ISubmitHandlerOnSubmit点击Submit键(默认是Enter键)对象被选中才会发生
ICancelHandlerOnCancel点击Cancel键(默认是Esc键)对象被选中才会发生
IMoveHandlerOnMove点击方向键对象被选中才会发生
IDropHandlerOnDrop拖拉结束拖拉开始的地方必须先实现IDragHandler,该事件在拖拉结束的对象上发生(但不能是拖拉开始的对象)


OnDrop的一个例子:物体A上实现了IDragHandler(和IDropHandler),物体B上实现了IDropHandler。从物体A上开始Drag,在物体A上结束Drag,没有触发OnDrop;从物体A上开始Drag,在物体B上结束Drag,可以触发OnDrop。









实战 - UGUI监听事件


使用方式



  1. 实现一个UIEventListener类,继承自MonoBehaviour

  2. 在需要监听事件的UI物体上绑定UIEventListener

  3. 使用该类上的AddEventListener来给事件绑定回调函数


代码实现


public class TestUIListener : MonoBehaviour, IPointerClickHandler {
    public delegate void GoDelegate(GameObject go);
    public GoDelegate onClick;

    void Start () {

    }

    void Update () {

    }

    public void AddListener(UIEventType eventType, object callBack)
    {
        //把回调函数转换为合适的委托函数
        GoDelegate goCallBack = null;
        if (callBack is LuaFunction)
        {
            goCallBack = delegate(GameObject obj)
            {
                (callBack as LuaFunction).Call(obj);
            };
        }


        else
        {
            goCallBack = callBack as GoDelegate;
        }

        //把回调添加到点击事件上
        if (eventType == UIEventType.CLICK)
        {
            onClick += goCallBack;
        }
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if(onClick != null)
            onClick(gameObject);
    }
}

上述代码为了简单只实现了点击的事件监听。


Lua使用例子


local listener = TestBtn:GetComponent("TestUIListener");
listener:AddListener(UIEventType.CLICK, OnClick);

function OnClick(go)
...
end

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多