Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用操纵杆移动鼠标光标?_C#_Unity3d_Input_Mouse_Joystick - Fatal编程技术网

C# 如何使用操纵杆移动鼠标光标?

C# 如何使用操纵杆移动鼠标光标?,c#,unity3d,input,mouse,joystick,C#,Unity3d,Input,Mouse,Joystick,这个问题似乎已经讨论过很多次了。但是我找不到解决我的问题的办法。所有的讨论要么是关于相机根据鼠标移动而旋转,要么是通过鼠标控制对象。但我需要用操纵杆(或键盘)控制鼠标指针。这看起来是个很简单的问题,但我很困惑。目前,我正试图隐藏硬件光标并重新创建自己的光标,用Input.GetAxis(“水平”)或Input.GetAxis(“鼠标X”)控制它,但光标只是消失了,事件系统报告没有移动。但是,如果我使用Input.mousePosition.x我的自定义光标可以很好地创建并用鼠标控制。不幸的是,我

这个问题似乎已经讨论过很多次了。但是我找不到解决我的问题的办法。所有的讨论要么是关于相机根据鼠标移动而旋转,要么是通过鼠标控制对象。但我需要用操纵杆(或键盘)控制鼠标指针。这看起来是个很简单的问题,但我很困惑。目前,我正试图隐藏硬件光标并重新创建自己的光标,用
Input.GetAxis(“水平”)
Input.GetAxis(“鼠标X”)
控制它,但光标只是消失了,事件系统报告没有移动。但是,如果我使用
Input.mousePosition.x
我的自定义光标可以很好地创建并用鼠标控制。不幸的是,我只需要用操纵杆来控制它。此外,它不适用于项目设置>>输入(或者可能我在那里更改了错误的内容),请提前感谢

public class cursor : MonoBehaviour
{
    public Texture2D cursorImage;

    private int cursorWidth = 32;
    private int cursorHeight = 32;
    public float horizontalSpeed = 2.0F;
    public float verticalSpeed = 2.0F;

    void Start()
    {
        Cursor.visible = false;
    }

    void OnGUI()
    {
        float h = horizontalSpeed * Input.GetAxis("Horizontal") * Time.deltaTime;
        float v = verticalSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
        GUI.DrawTexture(new Rect(h, Screen.height - v, cursorWidth, cursorHeight), cursorImage);
    }
}
您正在使用

float h=水平速度*Input.GetAxis(“水平”)*Time.deltaTime;
浮点v=垂直速度*输入.GetAxis(“垂直”)*时间.deltaTime;
DrawTexture(新的Rect(h,Screen.height-v,cursorWidth,cursorHeight),cursorImage);
h
v
Time相乘后总是有非常小的值。deltaTime
Input。GetAxis
afaik通常返回
0
1
之间的值

这些值并不表示实际的光标位置,而是相对于最后一帧位置的变化

光标将卡在左上角的某个位置


相反,您应该存储当前位置,并在更改时添加您的值

专用矢量2光标位置;
私有void Start()
{
Cursor.visible=false;
//可选择在开始时将其放置在中心
光标位置=新矢量2(Screen.width/2f,Screen.height/2f);
}
私有void OnGUI()
{
//这些不是实际位置,而是上一帧和现在之间的变化
float h=水平速度*Input.GetAxis(“水平”)*Time.deltaTime;
浮点v=垂直速度*输入.GetAxis(“垂直”)*时间.deltaTime;
//将更改添加到实际光标位置
光标位置x+=h;
光标位置y+=v;
DrawTexture(新的Rect(cursorPosition.x,Screen.height-cursorPosition.y,cursorWidth,cursorHeight),cursorImage);
}

还请注意,
水平速度
垂直速度
的单位为
像素/秒
,您可能希望某些值大于
2
;)

我使用了
200
和上、下、左、右键


如果有一个带有图像的画布覆盖层呢?您可以使用RectTransform使其move@Jichael谢谢你的建议。这确实是一个解决方案,我正在考虑这个问题。但整个应用程序的功能都是关于鼠标位置(显示坐标),我真的不想重写所有内容,获得画布世界的位置并将其转换为显示坐标。项目准备好了,我只需要实现操纵杆移动。你知道
Input.GetMouseButtonDown(0)在这里什么都不做,对吗?它返回一个你从未存储或使用过的布尔值。。。如果你真的想实现你自己的游标,可以使用UI和
ipointerHandler
IPointerClickHandler
等等,你必须实现你自己的@derHugo我知道,这些行在这里是无用的,只是剩下的。对不起,我会把它们拿走的太棒了,@derHugo!一如既往,信息量大,帮助大。非常感谢你!很抱歉再次打扰你,但我还有一个问题。一切都很完美,我得到了我需要的,但有一个问题,也许你可以再次帮助我。我有一个多显示器设置,光标不会转到第二个显示器。你知道什么会导致这个问题吗?谢谢。嗯,老实说,我对Unity中的多画面没有任何经验。。我唯一的猜测是,
OnGUI
可能不支持多个显示。。您可以尝试使用Unity中的法线组件。曾经也有一个问题,因此UI被严格限制在主显示器上。。对于
OnGUI
,可能仍然是这样。谢谢。我会想办法弄清楚的。无论如何,我总是有一个简单的解决方案,建立一个无边界窗口,并将其拖动到所有的显示器。再次感谢。