You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity实现鼠标光标置于目标Sprite后方的技术问询

实现光标置于Sprite后方的方案

系统原生光标是操作系统层面绘制在窗口最顶层的,没法直接修改它的渲染层级,所以得用「自定义模拟光标」的方式实现需求,具体步骤如下:

实现思路

  • 隐藏系统原生光标,用一个Sprite或UI Image替代作为模拟光标
  • 把模拟光标的渲染层级设为目标Sprite的下方(比如在Sorting Layer里选优先级更低的层,或者同层下设置更小的Order in Layer数值)
  • 实时更新模拟光标的位置,匹配鼠标的屏幕位置
  • 点击角色时触发光标状态切换

修改后的代码示例

首先在脚本里添加必要的变量:

public Texture2D cursor; // 原光标纹理
public GameObject customCursor; // 模拟光标的Sprite/UI物体
private bool picked = false;
private Vector2 cursorOffset = new Vector2(50, 48);

然后修改点击触发逻辑:

private void OnMouseDown()
{
    picked = !picked;
    
    if (picked)
    {
        // 隐藏系统光标
        Cursor.visible = false;
        // 启用模拟光标
        customCursor.SetActive(true);
    }
    else
    {
        // 恢复系统光标
        Cursor.SetCursor(cursor, cursorOffset, CursorMode.Auto);
        Cursor.visible = true;
        // 关闭模拟光标
        customCursor.SetActive(false);
    }
}

最后在Update里实时更新模拟光标位置(针对世界空间的Sprite):

private void Update()
{
    if (picked && customCursor.activeSelf)
    {
        // 将屏幕鼠标位置转换为世界空间位置,Z轴保持和模拟光标一致
        Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mouseWorldPos.z = customCursor.transform.position.z;
        customCursor.transform.position = mouseWorldPos + (Vector3)cursorOffset;
    }
}

细节提示

  • 如果模拟光标是UI Image,需要用RectTransformUtility.ScreenPointToLocalPointInRectangle将鼠标位置转换为UI空间坐标
  • 务必确认模拟光标的Sorting Layer和Order in Layer设置正确,确保它显示在目标Sprite的后方
  • 可以给模拟光标添加碰撞检测或射线检测,让它的点击行为和原系统光标保持一致

内容的提问来源于stack exchange,提问作者Maxime Dupuis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:17:38