废话:
woc····累死我了,搞了一下午,颈椎都要折了。。。赶紧趁热打铁记录一下。
有点用的铺垫:
为什么要写这篇博客呢?模拟鼠标点击又是什么意思呢?
先来理解鼠标点击,比如,你在浏览某些网站的时候,突然看到一张劲爆的美女图,心血来潮你想要看的更仔细是不是?于是你移动鼠标点了点美女,进入了新的页面,顿时看到了高清无码的美女图。爽!这是你人为控制的鼠标点击。
但是有些时候,我不想人为控制鼠标去点击某些东西,我想要程序内部给个坐标点,然后在该点模拟鼠标点击。比如我输入了该美女在屏幕坐标系下的位置,我想要程序替我点击了,从而进入新的页面。这就是我理解的模拟鼠标点击。
恩。。。为什么又在打擦边球啊摔!
继续废话:
好了言归正传。在实现该功能之前,我翻阅了我都不知道多少篇博客,但是恕我直言,各位大大都讲的太不详细了啊!!今天本博就来手把手讲述那些年在工地搬砖的故事。
重要!乖乖坐好看:
先上Demo,打开你的Unity,然后创建一个Button,让这个Button至于Canvas的中间
相信聪明的你应该已经知道我们要干啥了吧。
没错我们就是要让程序点击这个Button,而不是我们鼠标去点击这个Button!!!
亲爱的你,来思考一下,如果是你,你会怎么写这个程序?
前提:很明显,我们要知道这个Button的位置坐标,虽然在Unity中都各种坐标系:屏幕坐标、世界坐标、视口坐标。但是它们的转换都是Unity封装好的函数,直接调用就行了,所以我就不赘述了。这里我们假设Button的坐标,我们已知的是屏幕坐标。
思考:首先我们知道在Unity中并没有封装好的模拟鼠标点击的函数,但是在Windows下有封装好的模拟鼠标点击的函数,那就是SetCursorPos()&&mouse_event()。因此我们要想办法调用这两个函数。来看看这两个函数,要用它们必须导入user32.dll:
[DllImport("user32.dll")]
private static extern int SetCursorPos(int x,int y); //设置光标位置
[DllImport("user32.dll")]
private static extern bool GetCursorPos(ref int x,ref int y); //获取光标位置
[DllImport("user32.dll")]
static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo); //鼠标事件
到了这里,也许你开始激动了,我现在知道Button的屏幕坐标了,那我直接把这个坐标传给SetCursorPos不就行了吗?
非也非也。这里还牵扯到一个知识点,那就是Unity的屏幕坐标系和系统的桌面坐标系是不一样的,请看:
相信你可以看到,Unity的屏幕坐标系是从左下角开始,而桌面的屏幕坐标系是从左上角开始。
也许你看到这里又开始激动了,我直接拿Screen.Height-Pos.y不就把Unity坐标转换到桌面坐标了吗?非也非也。也许Unity不是在全屏模式下呢?
<