事件系统有三个要素:发送者,接收者, 转发者。
发送者有两种,一是相机,二是画布。发送者是事件的管理者,发起者,它们使用射线发射器来检测点击事件:
- 相机的physics Raycaster。
- 画面的Canvas Raycaster。
发送者是首要因素,如果不给相机添加physics Raycaster组件,场景中的任何3D物体都不会有射线检测的计算,拣选事件永远不会触发。
画面默认都带有Canvas Raycaster,因此不需要自己添加。只要UI自己处理好接收事件就可以接收消息了。
转发者是指触发器EventTriger,是接收到事件后对事件的转发。如Button的属性面板上的On Click()就是一个触发器。
接收者和触发者可以是UI或3D物体。只要实现了 IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
等接口就能接收到相关消息。以Button为例,实现UI的事件编写有三种方式:
- 给Button添加一个脚本,实现IPointerClickHandler的OnPointerClick()接口,就能接收到按钮的点击事件。
- 给按钮添加一个脚本,在脚本中GetComponent<Button>.onClick.AddListener(MyOnClick),点击按钮就会调用MyOnClick()的自定义方法。
- 给按钮添加一个脚本bltListener,里面定义一个函数void OnMyClick(),同时在On Click()区域添加一个触发项:object选Button本身,后面选bltListener.OnMyClick。这是按钮自己向自己发送事件。当点击按钮时,按钮将遍历所有添加的触发项,并调用触发项指定的脚本。
这三种方式本质上还是第一种方式。后面二种是UGUI实现的包装,便于使用和UI操作。
对于3D物体,只有使用第一种方式了,是最原始的通用方式。