Unity 模拟鼠标点击操作

这篇具有很好参考价值的文章主要介绍了Unity 模拟鼠标点击操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有个奇奇怪怪的BUG,需要定时模拟鼠标点击

就想到了这个骚操作。

C#本身带的类库中没有关于鼠标操作的函数库,需要引用微软的dll。
重点需要引入user32.dll,可以在C:\Windows\System32文件夹中找到,最好不要用网上下的,用本机的,我就吃了这个亏。

unity模拟鼠标点击,笔记,unity,计算机外设,c#

unity引入all

把dll放到unityAssets/Plugins文件夹下,
unity模拟鼠标点击,笔记,unity,计算机外设,c#

打包时系统自动把dll打包到
unity模拟鼠标点击,笔记,unity,计算机外设,c#

代码

using System;

public class MouseSimulater
{
    #region DLLs
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int SetCursorPos(int x, int y);
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern void mouse_event(MouseEventFlag dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);

    // 方法参数说明
    // VOID mouse_event(
    //     DWORD dwFlags,         // motion and click options
    //     DWORD dx,              // horizontal position or change
    //     DWORD dy,              // vertical position or change
    //     DWORD dwData,          // wheel movement
    //     ULONG_PTR dwExtraInfo  // application-defined information
    // );

    [Flags]
    enum MouseEventFlag : uint
    {
        //移动鼠标 
        Move = 0x0001,
        //模拟鼠标左键按下 
        LeftDown = 0x0002,
        //模拟鼠标左键抬起 
        LeftUp = 0x0004,
        //模拟鼠标右键按下 
        RightDown = 0x0008,
        //模拟鼠标右键抬起 
        RightUp = 0x0010,
        //模拟鼠标中键按下 
        MiddleDown = 0x0020,
        //模拟鼠标中键抬起 
        MiddleUp = 0x0040,
        XDown = 0x0080,
        XUp = 0x0100,
        //标示是否采用绝对坐标 
        Wheel = 0x0800,
        VirtualDesk = 0x4000,
        Absolute = 0x8000
    }
    #endregion

    // Unity屏幕坐标从左下角开始,向右为X轴,向上为Y轴
    // Windows屏幕坐标从左上角开始,向右为X轴,向下为Y轴

    /// <summary>
    /// 移动鼠标到指定位置(使用Unity屏幕坐标而不是Windows屏幕坐标)
    /// </summary>
    public static bool MoveTo(float x, float y)
    {
        if (x < 0 || y < 0 || x > UnityEngine.Screen.width || y > UnityEngine.Screen.height)
            return true;

        if (!UnityEngine.Screen.fullScreen)
        {
            UnityEngine.Debug.LogError("只能在全屏状态下使用!");
            return false;
        }
	// SetCursorPos 函数
	//把光标移到屏幕的指定位置。(ps:是整个屏幕的坐标,相对于屏幕左上角的绝对位置)

	//参数

	//X 指定光标的新的X坐标,以屏幕坐标表示。
	//Y 指定光标的新的Y坐标,以屏幕坐标表示。
	//返回值
	//如果成功,返回非0值
	//如果失败,返回值是0
        SetCursorPos((int)x, (int)(UnityEngine.Screen.height - y));
        return true;
    }

    // 左键单击
    public static void LeftClick(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
        //mouse_event 函数
		//综合鼠标移动和按钮点击。该方法包含鼠标左右移动及点击操作。
		//dx
		//指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标		的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。
		//dy
		//指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。
		//dwData
		//如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。如果dwFlagsS不是MOUSEEVENTF_WHEEL,则dWData应为零。
		//dwExtraInfo
		//指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessageExtraInfo来获得此附加信息
            mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
            mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 右键单击
    public static void RightClick(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.RightDown, 0, 0, 0, UIntPtr.Zero);
            mouse_event(MouseEventFlag.RightUp, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 中键单击
    public static void MiddleClick(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.MiddleDown, 0, 0, 0, UIntPtr.Zero);
            mouse_event(MouseEventFlag.MiddleUp, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 左键按下
    public static void LeftDown(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 左键抬起
    public static void LeftUp(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 右键按下
    public static void RightDown(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.RightDown, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 右键抬起
    public static void RightUp(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.RightUp, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 中键按下
    public static void MiddleDown(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.MiddleDown, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 中键抬起
    public static void MiddleUp(float x = -1, float y = -1)
    {
        if (MoveTo(x, y))
        {
            mouse_event(MouseEventFlag.MiddleUp, 0, 0, 0, UIntPtr.Zero);
        }
    }

    // 滚轮滚动
    public static void ScrollWheel(float value)
    {
        mouse_event(MouseEventFlag.Wheel, 0, 0, (uint)value, UIntPtr.Zero);
    }
}

Unity简单调用

	// 模拟鼠标左键按下
				MouseSimulater.LeftClick(450,850);

参数释义

unity模拟鼠标点击,笔记,unity,计算机外设,c#

参考

https://www.cnblogs.com/falcon-fei/p/11396740.html
https://blog.csdn.net/keneyr/article/details/98079695
https://blog.csdn.net/qq_21397217/article/details/78488072文章来源地址https://www.toymoban.com/news/detail-755159.html

到了这里,关于Unity 模拟鼠标点击操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 鼠标点击或触摸任意拖动UGUI的方法

    在Unity中,如果要通过鼠标拖到UI组件或者触摸移动UI组件,可以使用EventSystems下的方法。 具体实现如下: 新建一个脚本,DragController.cs: 然后把该脚本拉到UI组件中,运行后我们可以通过鼠标拖到UI组件,在触摸屏上,我们也可以通过触摸UI组件拖动。 效果如: Unity 鼠标点击

    2024年01月16日
    浏览(52)
  • unity制作游戏,点击鼠标左键,展示屏幕震动效果

    在Unity中实现点击鼠标左键展示屏幕震动效果可以通过以下步骤进行: 创建一个新的C#脚本,例如\\\"ScreenShake.cs\\\",并将其附加到想要添加屏幕震动效果的游戏对象上。 在脚本中定义一个变量来控制震动的幅度,例如 public float shakeAmount = 0.1f; 。 在Update函数中检测鼠标左键点击事

    2024年02月12日
    浏览(43)
  • 2d平面unity,鼠标点击某个位置,人物角色朝这个方向移动

    2d平面unity,鼠标点击某个位置,人物角色朝这个方向移动 如果我们没有将鼠标点击位置转换为世界坐标系中的位置,而是直接将屏幕坐标系中的位置作为角色移动的目标位置,那么可能会发生以下两种情况: 角色会偏离目标位置 由于屏幕坐标系中的位置和世界坐标系中的位

    2024年02月06日
    浏览(79)
  • unity手指、鼠标滑动实现物体360度旋转、点击按钮实现物体旋转

    先创建一个ObjectRotation 脚本 之后将该脚本拖动到需要转动的object上 因为如果每次都真机模拟回很麻烦,所以我加入了让鼠标代替手指滑动的脚本来代替手指输入 同样的也是先创建一个MouseRow 脚本 最后我还需要某笔画沿着坐标旋转,代码如下: 里面有我的其他参数,如果读

    2024年02月11日
    浏览(66)
  • Unity 通过鼠标控制模拟人物移动和旋转视角

    要通过鼠标控制并模拟人物移动和转换视角,将会使用射线检测、鼠标点击和鼠标水平移动,配合物体旋转和移动方法共同实现。 首先搭建个由一个Plane地板和若干cube组成的简单场景: 其次创建一个Capsule作为移动物体,并把摄像头拉到该物体中。 创建以下脚本:  把脚本拉

    2024年02月03日
    浏览(45)
  • 计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

    键盘响应中有一个函数叫做 waitKey ,所有的获取键盘键值都是通过waitKey函数实现的。 1.键盘响应事件 cv.waitKey( [, delay] ) -- retval delay如果没有声明或者delay=0,表示一直阻塞 delay大于0,表示阻塞指定毫秒数 retval返回的对应键盘键值,注意:在不同的操作系统中可能会有差异! 典

    2024年02月09日
    浏览(49)
  • 计算机操作系统实验-进程调度模拟算法

    进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。 1.设计进程控制块 PCB 的结构,通常应包括如下信息: 进程名、进程优先数(

    2024年02月05日
    浏览(74)
  • 实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR

    实验内容: 实现时间片轮转算法(模拟),要求如下: 1、用到的数据结构 /* PCB / struct PCB { pid_t pid;//进程 PID int state; //状态信息,1 表示正在运行,0 表示暂停,-1 表示结束 unsigned long runned_time;//已运行时间 unsigned long need_running_time;//剩余运行时间 }; / PCB集合 */ struct PCB pcb[TOT

    2024年02月04日
    浏览(55)
  • Unity编程之简易计算机

    效果如下 实现计算器的主要思路: 将(点击按键)输入的式子 存储 起来并 计算 。 计算式子 输入:式子的字符串 输出:计算结果 这是一个经典的队列数据结构应用的问题,具体的解法无需赘述(网络上有很多资源) 核心思想:用两个队列分别维护数字和运算符,对于不

    2024年02月01日
    浏览(43)
  • 学习unity需要的计算机配置及预算(更新)

    unity对电脑的配置要求还是比较高的 ,这类处理图形界面的东西都是需要消耗一些计算机资源的,但Unity的建模、蒙皮、渲染、加特效等操作是比较吃电脑配置的,所以需要的配置也相对好一些。 如果你在家使用的话建议用台式机性价比高一些,如果你用笔记本的话可以选择

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包