【问题标题】:Move the mouse pointer in a specific direction with unity统一移动鼠标指针到特定方向
【发布时间】:2022-01-28 12:36:22
【问题描述】:

我想用类似的方式移动鼠标指针:mouseposition += new Vector2(x, y)。 “GetCursorPos”始终为 (0, 0),因此我无法使用 delta 值移动鼠标指针,但我可以使用 SetCursorPos 将其移动到某个坐标。我尝试了以下代码:

using UnityEngine;
using System.Runtime.InteropServices;

public class all : MonoBehaviour
{
    public Vector2 MoveMouse;

    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int X, int Y);
    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(out Vector2 pos);

    private void FixedUpdate()
    {
        Vector2 cursorPos = new Vector2();
        GetCursorPos(out cursorPos);
        //finding the cursor's position

        SetCursorPos(Mathf.RoundToInt(cursorPos.x + MoveMouse.x), Mathf.RoundToInt(cursorPos.y + MoveMouse.y));
        //cursorpos += MoveMouse
    }
}

我尝试了另一个代码,将 GetCursorPos 替换为另一个值,但是当我移动鼠标指针时它会随机移动一点。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

public class all : MonoBehaviour
{
    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int X, int Y);
    public Vector2 offset;
    bool started;
    private void Start()
    {
        StartCoroutine(waiting());
    }
    private void FixedUpdate()
    {
        if (started)
        {
            SetCursorPos(Mathf.RoundToInt(Input.mousePosition.x + offset.x), Mathf.RoundToInt(-(Input.mousePosition.y + offset.y)));
        }
    }
    IEnumerator waiting()
    {
        Application.runInBackground = true;
        SetCursorPos(0, 0);
        yield return new WaitForEndOfFrame();
        offset = new Vector2(-Input.mousePosition.x, -Input.mousePosition.y);
        started = true;
    }
}

【问题讨论】:

  • 这个答案说得很好:stackoverflow.com/a/46999239/13460353我希望这会有所帮助。
  • 我想要鼠标在windows坐标系中的位置,或者平移鼠标。该答案使用 input.mouseposition 和 screentoworldpoint,这两件事是不同的

标签: c# visual-studio unity3d mouse


【解决方案1】:

使用新的输入系统(通过 packagemanager 安装),您可以使用 Mouse.current.WarpCursorPosition(...)(截至 2020 年 11 月的输入系统版本 1.0.0,或者 1.1.0 预览版 2)。

https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Mouse.html:

在桌面平台(Windows、Mac、Linux 和 UWP)上,您可以通过代码移动鼠标光标。请注意,这会移动系统的实际鼠标光标,而不仅仅是 Unity 内部存储的鼠标位置。这意味着用户看到光标跳到不同的位置,这通常被认为是不好的 UX 实践。建议仅在光标隐藏时执行此操作(有关详细信息,请参阅 Cursor API 文档)。

【讨论】:

    【解决方案2】:

    所以我必须自己做

    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    public class MouseControl : MonoBehaviour
    {
        [DllImport("user32.dll")]
        public static extern bool SetCursorPos(int X, int Y);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool GetCursorPos(out MousePosition lpMousePosition);
    
        public int xdmp;
        public int ydmp;
        [StructLayout(LayoutKind.Sequential)]
        public struct MousePosition
        {
            public int x;
            public int y;
        }
        private void FixedUpdate()
        {
    
            if(Input.GetKeyDown(KeyCode.Space))
            {
                xdmp = 0;
                ydmp = 0;
            }
    
            MousePosition mp;
            GetCursorPos(out mp);
    
            print(mp.x + " " + mp.y);
    
            SetCursorPos(mp.x + xdmp, mp.y + ydmp);
        }
    }
    

    【讨论】:

    • 我也做了同样的事情,但我似乎无法访问 SetCursorPosition/GetCursorPosition 函数。我需要做什么才能访问它们
    • 它只适用于windows。你必须引用一个值作为输出:“MousePosition mp;GetCursorPos(out mp);”如果你不在这个类中,那么你必须使用:“MouseControl.MousePosition mp;MouseControl.GetCursorPos(out mp);”
    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多