界面是所有游戏工程不可缺少的部分,而大部分项目必须会含有一套控制界面的基础类
NGUI 的 UICamera 和 EventSystem 应该是 2 个不同的玩意,但是他们都会使用 raycast 得到一个点击的列表,然后由近到远决定处理方式,
一般 UICamera 挂在 UI 相机上,然后设置其事件响应层以及相机的剔除遮罩,raycast 得到碰撞列表后,像最近的物件发送事件和参数,如果该物件上有其他不同的方法实现
则会报异常,就是通常新 UI 系统和 NGUI 系统一起用的时候,会出现一些乱七八糟说参数不匹配的异常
类似 NGUI 的 UICamera 向一个对象发送信息 gameobject.sendmessage("OnSelect", true)
假如这个 gameobject 上挂了一个 Button 这个是系统内置的,那么这个 Button 应该是实现了一个非 Bool 类型参数的 OnSelect(BaseEventData data)
这个时候,就会出错,说函数参数不匹配,这样来看 UICamera 的做法,gameobject.sendmessage 诸如此类的实际上弊病很大,特别是一些 Component 具有相同函数名,但是参数原型不匹配时
实际上 2 者大部分应该是能转换的
系统 UI 内的图像原件,都会有 raycastTarget 勾选框,也就是说,贴一张图,加一个 Button 原件,就可以在点到该图像时,进入到 Button 原件的自定义事件内,也就是 OnClick
要想有更详细的事件类似 UICamera 发送的 onpress ondrag onselect 等,则需要自己仿造 UICamera 的逻辑,来处理 IPointerDownHandler, IPointerUpHandler, IPointerExitHandler 接口
类似
public class GameButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
void Start(){}
void Update(){}
public void OnPointerDown(PointerEventData eventData){}
public void OnPointerUp(PointerEventData eventData){}
public void OnPointerExit(PointerEventData eventData){}
}
有一点需要注意,要让含有 raycastTarget 勾选框的原件响应点击事件,还需要查看其与 UI 相机的朝向,有次测试无论如何点一个 Image 都无法触发事件,原来是他的 y 轴旋转填了 180,后来置 0 后就可以触发了
点击鼠标后 raycast 触发碰撞的列表,可以在场景树组织中选中 EventSystem 物件查看
关于# NGUI 的(UICamera)事件处理 有篇文章
https://www.zhuzhehao.cn/?p=184
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于