【问题标题】:Change mouse cursor icon in C#在 C# 中更改鼠标光标图标
【发布时间】:2019-12-16 06:46:29
【问题描述】:

我正在为 Windows PC 构建游戏,当用户在可点击的 UI 元素上时,我需要更改光标图标。我找到了这个命令Cursor.SetCursor(texture2d, vector2),但它有一些滞后。

当鼠标悬停在 UI 元素上时,它会发生变化,但会有一些延迟,这真的很烦人(这就是其他用户所说的)。

经过一番阅读,我了解到 Unity 基本上只是在软件级别更改了光标图标。即隐藏光标并显示我的图像,并使其跟随光标位置。

我的问题是:我怎样才能在硬件级别更改图标,同样,仅在 Windows 版本中。

当我搜索“在 C# 中更改鼠标光标”时,我找到了 windows.forms 选项(不能统一使用)和一个 c++ 代码,但它并不完整(仅方法的名称),我不知道如何在 C# 中运行它……

【问题讨论】:

  • @GehanFernando 正如我在问题中所写,Unity 无法识别 Windows.Forms 命名空间,因此我无法使用它
  • SetCursor 工作正常,甚至还有一个可选参数来强制硬件
  • @Jichael 如果它工作正常,我不会问这个问题。我的游戏的用户说它有太多延迟
  • 那么它可能是你的实现可能是错误的。而且我还告诉你它有强制硬件模式,你试过了吗?

标签: c# c++ unity3d mouse-cursor


【解决方案1】:

SetCursor 不是在所有 Windows 应用程序上都能很好地工作,但它是正确的方法。

Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);

另一种方法是制作一个隐藏鼠标光标的 Little fake 并为您想要的情况制作一个 GUI 光标。您可以为要自定义的每个事件添加更多条件。

var OnMouseEnterCursor:Texture2D;
var cursorSizeX: int = 32;  // your cursor width
var cursorSizeY: int = 32;  // your cursor height
var MouseEnterCond = false;

function OnMouseEnter()
{
 MouseEnterCond = true;
 Screen.showCursor = false;
}

function OnMouseExit()
{
 MouseEnterCond = false;
 Screen.showCursor = true;
}

function OnGUI()
{
    if(MouseEnterCond )
    {
     GUI.DrawTexture (Rect(Input.mousePosition.x-cursorSizeX/2 + cursorSizeX/2, (Screen.height-Input.mousePosition.y)-cursorSizeY/2 + cursorSizeY/2, cursorSizeX, cursorSizeY),OnMouseEnterCursor);
    }
}

【讨论】:

  • 不是和软件光标一样吗? 只是在光标位置渲染的图像
  • 是的,是在光标位置渲染的图像,隐藏了硬件光标。是另一种实现方式,它干净、简单、100% 可定制并且可以毫无延迟地正常工作。
【解决方案2】:

如果有办法在 Unity 中强制使用硬件光标,世界还没有找到它。

Unity 的 own documentation 很好地解释了这一点: 通过您自己找到的功能在受支持的平台上首选硬件光标(请记住将光标模式设置为自动),但它会自动且无法控制地回退到不受支持的平台和分辨率的软件。

需要注意的重要一点是,在项目设置/播放器设置菜单中有一个特殊字段(仅供参考),称为“默认光标”。 这是唯一支持的硬件光标,例如Windows 商店应用程序。

并记得将纹理设置为在其配置中键入“光标”。

最后,请记住windows only supports the 32x32px size。这可能会在选择渲染类型时强制 Unity 使用。

【讨论】:

  • 我的纹理被定义为光标,它是 32X32px,在编辑器中一切都很好,但是在构建之后我得到了一个奇怪的光标纹理
【解决方案3】:

播放器设置中的默认光标设置在编辑器中有效,但未显示在构建中。还将纹理大小限制为 32x32。我通过在脚本中使用Cursor.SetCursor 方法来更改光标解决了这个问题。

[SerializeField] Texture2D cursor;

void Start() {
       Cursor.SetCursor(cursor, Vector3.zero, CursorMode.ForceSoftware);
}

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多