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
,可能仍然是这样。谢谢。我会想办法弄清楚的。无论如何,我总是有一个简单的解决方案,建立一个无边界窗口,并将其拖动到所有的显示器。再次感谢。