新闻详情

新闻详情

首页 / 资讯中心 / 详情

【Unity】Cursor类——隐藏鼠标、锁定鼠标、设置鼠标图标与 TaoToken 统一 Key 配置

发布时间:2026/10/2 16:27:45来源:尧图网络
【Unity】Cursor类——隐藏鼠标、锁定鼠标、设置鼠标图标与 TaoToken 统一 Key 配置
1. Unity Cursor 类到底能做什么为什么鼠标状态总在编辑器里翻车Unity 的Cursor类是一个静态类挂在UnityEngine命名空间下专门管三件事鼠标指针可不可见、鼠标指针能不能跑出窗口、鼠标指针长什么样。听起来简单但真正在项目里用起来很多人会卡在几个地方编辑器里点了 Play 鼠标消失了按 Esc 也回不来打包成 Windows 独立程序后锁定失效换了自定义图标结果图片被拉伸成马赛克再往后接入大模型 API 做智能 NPC 或编辑器工具时Key 散落在各个脚本里改一次要翻半天。这篇就围绕Cursor.visible、Cursor.lockState、Cursor.SetCursor三个核心 API 展开同时把 TaoToken 的统一 Key 配置接进来让鼠标状态管理和 API 鉴权在同一个项目里都能稳定跑。适合刚学 Unity 不久、想搞清楚鼠标控制细节的同学也适合已经在做 AI 驱动玩法、需要统一管理调用凭证的开发者。先说清楚Cursor类的能力边界。它不负责鼠标点击事件那是Input或新输入系统的事它也不管 UI 上的指针样式UI 层面要用 EventSystem 那套。Cursor只管视觉和锁定状态。理解这一点后面排查问题会省很多力气。Cursor.visible是布尔值true显示、false隐藏。注意它隐藏的是系统光标不是把鼠标输入也屏蔽掉鼠标坐标依然在变只是你看不见指针。Cursor.lockState是枚举有三个值None不锁定鼠标可以自由移动Locked把鼠标锁在屏幕中心并自动隐藏Confined把鼠标限制在窗口范围内指针还在但出不去。很多人以为Locked只是限制位置其实它同时会隐藏光标这是官方行为别在代码里再手动设一次visible容易互相打架。Cursor.SetCursor用来换图标三个参数Texture2D图片、Vector2热点偏移、CursorMode模式。热点就是指针的“点击原点”比如箭头图标的热点在左上角就传Vector2.zero如果是十字准星热点在正中心就传图片宽高的一半。CursorMode.Auto让 Unity 自己决定用硬件还是软件光标绝大多数情况用 Auto 就行。我试过在一个第一人称项目里同时用Locked和自定义准星结果准星图标死活不显示后来发现是Locked状态下系统光标被隐藏自定义图标也被一起盖掉了。解决办法是锁定状态下用 UI Image 画准星而不是依赖SetCursor。这个坑后面排障章节会再展开。2. TaoToken 统一 Key 前置配置让编辑器与运行时共用一套鉴权在讲鼠标代码之前先把 TaoToken 的接入配好因为后面验证请求要用到。TaoToken 是一个统一的大模型 API 通道官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。它的价值在于不管你项目里要调对话模型、写代码的模型还是 Agent 类模型都可以用同一套 Base URL 和同一个 Key不用为每个模型单独记地址。第一步去控制台创建 Key。打开 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsole_keyutm_campaignrewrite 登录后在 API Keys 页面点新建复制出来的字符串就是你的 Key形如sk-开头的一长串。这个 Key 只显示一次建议立刻存到密码管理器里。第二步确认你要用的模型 ID。在模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodels_chatutm_campaignrewrite 可以看到当前可用的模型列表每个模型都有对应的 ID比如做代码补全常用的那类模型 ID。记下你要用的那个。第三步把 Base URL 和 Key 写进项目配置。Unity 项目里我习惯用一个ScriptableObject或者Resources下的 JSON 来存避免硬编码在脚本里。下面是一个可复制的settings.json片段放在Assets/Resources/taotoken_settings.json{ baseUrl: https://taotoken.net/api, apiKey: sk-你的Key粘贴在这里, modelId: 你的模型ID, timeoutSeconds: 30 }然后在 C# 里读它using System.IO; using UnityEngine; [System.Serializable] public class TaoTokenSettings { public string baseUrl; public string apiKey; public string modelId; public int timeoutSeconds; } public static class TaoTokenConfig { public static TaoTokenSettings Load() { var path Path.Combine(Application.dataPath, Resources/taotoken_settings.json); var json File.ReadAllText(path); return JsonUtility.FromJsonTaoTokenSettings(json); } }注意Application.dataPath在编辑器里指向Assets文件夹打包后指向可执行文件同级目录所以正式发布时要把 JSON 放到StreamingAssets里用Application.streamingAssetsPath读或者干脆用环境变量注入。这里为了演示方便先用 Resources 方式。如果你用的是 Claude Code 这类命令行工具做辅助开发配置方式略有不同。Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_claudecodeutm_campaignrewrite 里面会说明怎么设置ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY两个环境变量。把 Base URL 指向https://taotoken.net/apiKey 用刚才创建的那个就能让 Claude Code 走统一通道。这一步和 Unity 项目本身是分开的但同一个 Key 可以复用省得记多套凭证。对于长期做编码和 Agent 开发的场景可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcodingplanutm_campaignrewrite 它更适合高频调用、需要稳定额度的项目。普通验证和轻量使用直接用按量计费的 Key 就够了。配置完成后建议先别急着写鼠标代码用模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodels_chatutm_campaignrewrite 发一条测试消息确认 Key 和模型 ID 都对。这一步能排除掉大部分鉴权问题后面 Unity 里报 401 时你就知道不是 Key 的问题。3. 可复制的 Cursor 配置代码隐藏、锁定、图标一次配齐现在进入正题把三个功能写成可复制的代码。我习惯把它们拆成三个方法放在一个CursorController脚本里挂到场景中任意一个 GameObject 上。先看隐藏鼠标。最简单的写法using UnityEngine; public class CursorController : MonoBehaviour { void Start() { // true 显示false 隐藏 Cursor.visible false; } }但实际项目里隐藏鼠标往往和游戏状态绑定。比如进入游戏时隐藏打开暂停菜单时显示。所以更实用的写法是用一个方法封装public void SetCursorVisible(bool visible) { Cursor.visible visible; }再看锁定鼠标。Cursor.lockState有三个值我一般用一个枚举参数来控制public void SetCursorLock(CursorLockMode mode) { Cursor.lockState mode; }调用时传CursorLockMode.Locked就锁定并隐藏传CursorLockMode.Confined就限制在窗口内传CursorLockMode.None就解除。注意Locked会自动隐藏光标所以如果你先设了visible true再设lockState Locked光标还是会被隐藏顺序不影响最终结果但逻辑上要清楚。设置鼠标图标稍微复杂一点因为要处理图片导入设置。先把光标图片拖进Assets选中它在 Inspector 里把Texture Type改成Cursor这样 Unity 才会按光标的方式处理。图片宽高要一样比如 32x32 或 64x64否则会被拉伸变形。然后代码里这样写public Texture2D cursorTexture; public void SetCustomCursor() { // 参数1光标图片 // 参数2热点偏移相对图片左上角 // 参数3平台支持的光标模式一般用 Auto Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto); }热点偏移怎么算假设你的图片是 32x32箭头尖端在左上角那热点就是Vector2.zero。如果是一个圆形准星中心在 (16, 16)那热点就是new Vector2(16, 16)。传错了会导致点击位置和视觉位置对不上这个在射击类项目里特别明显。把三个功能合起来完整的CursorController长这样using UnityEngine; public class CursorController : MonoBehaviour { public Texture2D cursorTexture; void Start() { // 默认隐藏并锁定 Cursor.visible false; Cursor.lockState CursorLockMode.Locked; } void Update() { // 按 Esc 解除锁定方便编辑器里调试 if (Input.GetKeyDown(KeyCode.Escape)) { Cursor.lockState CursorLockMode.None; Cursor.visible true; } // 按空格重新锁定 if (Input.GetKeyDown(KeyCode.Space)) { Cursor.lockState CursorLockMode.Locked; Cursor.visible false; } } public void ApplyCustomCursor() { Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto); } }这段代码在编辑器里跑起来后点 Play 鼠标会消失并锁在屏幕中心按 Esc 恢复按空格再锁定。ApplyCustomCursor可以绑到一个按钮上手动触发或者在某些状态下自动调用。这里要提醒一个编辑器特有的坑在 Unity 编辑器里按 Play 后如果lockState设成Locked鼠标会被锁住这时候想点编辑器里的停止按钮都点不到。所以上面代码里加了 Esc 解锁的逻辑这是保命操作。打包成独立程序后没这个问题但编辑器里调试一定要留后路。另外Cursor.SetCursor在Locked状态下可能不生效因为系统光标被隐藏了。如果你需要锁定状态下显示自定义准星正确做法是用一个 UI Image 跟随鼠标位置而不是依赖SetCursor。这个区别很多人第一次做 FPS 项目时都会踩。4. 验证请求与鼠标状态切换确认配置真的生效代码写完了怎么确认它真的在工作分两步验证先验证鼠标状态再验证 TaoToken 请求。鼠标状态验证很简单。在编辑器里点 Play观察三件事鼠标指针是否消失、移动鼠标时视角是否还在转说明输入没被屏蔽、按 Esc 后指针是否回来。如果指针消失但视角不转说明输入系统那边有问题不是Cursor的锅。如果按 Esc 指针不回来检查是不是有别的脚本在Update里又把lockState设回去了。更严谨的做法是加一行日志void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { Cursor.lockState CursorLockMode.None; Cursor.visible true; Debug.Log($lockState{Cursor.lockState}, visible{Cursor.visible}); } }控制台会打印出当前状态确认和你设的一致。Locked状态下visible可能显示true但实际不可见这是正常的以lockState为准。接下来验证 TaoToken 请求。写一个简单的协程用UnityWebRequest发一条对话请求using System.Collections; using System.Text; using UnityEngine; using UnityEngine.Networking; public class TaoTokenTest : MonoBehaviour { IEnumerator Start() { var settings TaoTokenConfig.Load(); var url settings.baseUrl /v1/chat/completions; var body new { model settings.modelId, messages new[] { new { role user, content 用一句话说明 Unity Cursor 类的作用 } } }; var json JsonUtility.ToJson(body); var request new UnityWebRequest(url, POST); request.uploadHandler new UploadHandlerRaw(Encoding.UTF8.GetBytes(json)); request.downloadHandler new DownloadHandlerBuffer(); request.SetRequestHeader(Content-Type, application/json); request.SetRequestHeader(Authorization, Bearer settings.apiKey); yield return request.SendWebRequest(); if (request.result UnityWebRequest.Result.Success) { Debug.Log(响应 request.downloadHandler.text); } else { Debug.LogError($错误码{request.responseCode}内容{request.downloadHandler.text}); } } }把这段挂到场景里运行后看控制台。成功的话会打印出模型返回的文本里面应该包含对Cursor类的解释。如果返回 401说明 Key 不对如果返回 404检查 Base URL 是不是多了或少了斜杠如果卡住不动检查网络和超时设置。这里有个细节JsonUtility对匿名类型的支持有限上面用匿名对象拼 JSON 在部分 Unity 版本会出问题。更稳的写法是定义一个[System.Serializable]的请求类或者直接用字符串拼接。我实测下来用字符串拼接最省事var json {\model\:\ settings.modelId \,\messages\:[{\role\:\user\,\content\:\测试\}]};虽然不够优雅但兼容性最好。正式项目里建议用 Newtonsoft.Json 或者 Unity 的JsonUtility配合具体类。验证通过后你就有了一个能同时管理鼠标状态和 API 调用的项目骨架。鼠标部分负责交互体验TaoToken 部分负责智能能力两者互不干扰但共用一套配置管理思路。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节把实际开发中最容易撞上的几个报错列出来对照着排查。401 Unauthorized。这是鉴权失败九成是 Key 的问题。先检查settings.json里的apiKey有没有多余空格再确认 Key 有没有过期或被删除。如果用的是环境变量方式检查变量名有没有拼错Claude Code 那边是ANTHROPIC_API_KEY别写成ANTHROPIC_KEY。还有一种情况是 Base URL 写成了带路径的形式比如https://taotoken.net/api/v1而代码里又拼了一次/v1/chat/completions变成/api/v1/v1/chat/completions也会报 401 或 404。正确做法是 Base URL 只写到https://taotoken.net/api路径在代码里拼。local proxy failed。这个报错通常出现在命令行工具或某些 IDE 插件里意思是本地代理连接失败。先确认你的网络能正常访问https://taotoken.net/api用浏览器打开这个地址看能不能返回信息。如果浏览器能开但工具报错检查工具里的代理设置是不是指向了一个不存在的本地端口。有些工具默认会读系统代理而系统代理可能配了一个已经关掉的软件。解决办法是在工具配置里显式关闭代理或者把 Base URL 直接写成完整地址绕过代理探测。reading choices 相关报错。这个一般出现在解析响应的时候报错信息里带reading choices或cannot read property choices of undefined。原因是返回的 JSON 结构和你预期的不一样通常是请求失败了但代码没检查状态码直接去读choices字段。修复方法是先判断responseCode是不是 200不是的话把原始响应打印出来看。常见触发场景是模型 ID 写错服务端返回了一个错误对象里面没有choices字段。OAuth 相关报错。如果你用的是 Claude Code 或类似工具可能会遇到 OAuth 认证失败。这类工具有些默认走 OAuth 流程但接入 TaoToken 时应该用 API Key 方式。检查配置文件里是不是同时存在 OAuth token 和 API Key两者冲突会导致认证失败。正确做法是只保留 API Key把 OAuth 相关的字段清掉。Claude Code 的接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_claudecodeutm_campaignrewrite 里有详细说明照着配就行。鼠标锁定后编辑器卡死。这个不算报错但很常见。原因是Locked状态下鼠标被锁在屏幕中心你没法点停止按钮。解决办法就是前面说的加一个 Esc 解锁的快捷键。如果已经卡死了按 AltTab 切出去再切回来或者用任务管理器结束 Unity 进程。养成调试时留后路的习惯。自定义光标不显示。检查三件事图片的Texture Type是不是Cursor图片宽高是不是一样SetCursor调用时lockState是不是Locked。如果是Locked换成 UI 方式画准星。另外CursorMode.Auto在某些平台上会回退到软件光标如果图片太大可能不显示换成 32x32 试试。Codex auth.json 配置问题。如果你用 Codex 类工具配置文件通常在~/.codex/auth.json里面要填 Base URL、Key 和 Model ID 三件套。Base URL 写https://taotoken.net/apiKey 写你的sk-开头字符串Model ID 写模型列表里看到的那个。三个缺一不可少一个就会报鉴权或模型不存在。改完记得重启工具有些工具不会热加载配置。排查的核心思路就一条先确认请求有没有发出去再看返回的状态码最后看响应体。大部分问题在状态码那一步就能定位。6. 把鼠标控制和统一 Key 沉淀成项目规范走到这里你已经有了能跑的鼠标控制代码和能用的 TaoToken 配置。最后说几个把它变成项目规范的建议都是实际项目里踩出来的。第一鼠标状态用一个集中管理器别在每个脚本里散着写Cursor.visible false。散着写的问题是A 脚本隐藏了B 脚本又显示最后状态取决于执行顺序很难调。用一个CursorManager单例所有状态变更都走它日志也统一打出问题一眼能看出是谁改的。第二TaoToken 的 Key 绝对不要提交到版本控制。settings.json加进.gitignore仓库里放一个settings.example.json模板新人拉下来复制一份填自己的 Key。如果团队共用用环境变量注入CI 里配好就行。第三模型 ID 和 Base URL 也放进配置别硬编码。今天用这个模型明天可能换一个改配置比改代码快。Base URL 统一写https://taotoken.net/api所有调用都基于它拼路径换通道时只改一处。第四给 API 调用加一层薄封装统一处理超时、重试和错误日志。Unity 的UnityWebRequest用起来不难但每个调用点都写一遍鉴权头和错误处理很啰嗦。封装一个TaoTokenClient类暴露PostAsync方法内部处理这些细节业务代码只管传 prompt 和收结果。第五编辑器里调试鼠标锁定一定要留解锁快捷键这是血泪教训。我见过不止一个同事因为忘了加 Esc 解锁每次测试都要强杀 Unity 进程。加一行代码的事能省很多时间。如果你还在选长期用的编码方案可以看看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcodingplanutm_campaignrewrite 它适合需要稳定调用额度的场景。日常验证和轻量使用直接用 API Keys 页面创建的 Key 就够了入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapikeysutm_campaignrewrite 。接入过程中遇到文档没覆盖的问题翻一下接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 大部分配置细节都在里面。把鼠标控制和 API 鉴权这两件事都规范化之后项目里再加新的交互功能或者新的模型调用就只是往框架里填内容不用每次重新搭一遍。这才是统一 Key 和集中管理真正的价值。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

wifit3 对接 hashcat 22000 模式:hc22000 导出到字典爆破的完整指南 2026/10/2 17:23:32

wifit3 对接 hashcat 22000 模式:hc22000 导出到字典爆破的完整指南

wifit3 对接 hashcat 22000 模式:hc22000 导出到字典爆破的完整指南 【免费下载链接】wifit3 Wifite but USB-only & cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3 wifit3 是一款跨平台的 USB Wi-Fi 审计工具,抓…

阅读更多 →
从代码补全到Agent模式:我用OpenCode重构异步模块的实战记录 2026/10/2 17:23:32

从代码补全到Agent模式:我用OpenCode重构异步模块的实战记录

最近一个月,我把相当一部分日常开发从IDE里的AI补全切换到了终端里的Agent工具,OpenCode是其中让我最“上头”的一个。刚开始挺不适应——以前打开Cursor或者GitHub Copilot,习惯是光标停在那里等一个补全建议;而OpenCode这种工具…

阅读更多 →
1.1 清印 ClearMark — 一款本地文档去水印工作台的完整设计与实现 2026/10/2 17:23:31

1.1 清印 ClearMark — 一款本地文档去水印工作台的完整设计与实现

1.1 清印 ClearMark — 一款本地文档去水印工作台的完整设计与实现系列第 1 篇 共 12 篇 这不是一篇产品软文,而是一名一线开发者对自己做过的一个工具系统的复盘。从产品定位、架构选型,到 PDF 内容流解析、扫描件像素级水印检测、OpenCV 图像修复、Py…

阅读更多 →
一线观察多年,我看到江浙沪3-18岁青少儿心理服务的适配边界 2026/10/2 17:23:31

一线观察多年,我看到江浙沪3-18岁青少儿心理服务的适配边界

我扎在江浙沪3-18岁青少儿心理这个赛道摸了快5年,跑过不下三四十所学校,接触过近千个家庭,最近很多人问我,怎么找适配的心理服务,其实我最先想说的是,大部分人到现在都还没搞懂这个赛道的真实适配边界。先聊…

阅读更多 →
CentOS Stream浴火重生 2026/10/2 17:23:31

CentOS Stream浴火重生

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlCentOS Linux 在 2024 年 6 月 30 日走完了 CentOS 7 的最后一段支持周期。很多人说 CentOS 死了。更准确的说法是:死的是传统 CentOS Linux,活下来的是…

阅读更多 →
MySQL教务系统数据库设计实战:从ER图到可执行SQL 2026/10/2 17:23:25

MySQL教务系统数据库设计实战:从ER图到可执行SQL

简介:本资源是山东科技大学计算机科学与技术专业《数据库系统概论》课程设计的完整实验报告,面向高校数据库初学者与课程实践者,聚焦DBMS核心功能——表的创建与修改,帮助学生深入理解关系型数据库底层实现原理。报告由郑通同学于…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉