Unity新Input System上手与迁移实战:告别GetKey,拥抱Action Mapping
我刚开始在新项目里全套搬迁到Unity新版Input System的时候老实说心里是有点虚的。毕竟在旧版Input Manager上写了无数个GetAxis和GetKeyDown习惯这东西不是说改就能改。但真正上手之后我只能说回不去了。这套系统虽然学习曲线比老接口陡不少但它是真的为现代游戏的操控需求设计的——多平台、多手柄、按需重绑定、输入缓冲、动作映射这些以前要自己写半天的功能现在全都有官方的正经方案了。如果你正站在“要不要切”的岔路口或者已经切过来但被Asset、Action、Binding这些概念搞得头大这篇东西值得你花几分钟读完。1. 为什么非得换这套新输入系统老接口到底差在哪先聊点背景。老Input Manager不是不能用但它的设计思路停留在一个相对简单的时代键盘、鼠标、一个手柄映射关系基本写死在Input Settings里。到了今天你的游戏可能要上Steam、Switch、手机还可能支持玩家自己改键甚至做跨平台联机。这种情况下老系统的几个硬伤就非常明显了。第一代码和按键名绑得太死。你在代码里写Input.GetKeyDown(KeyCode.Space)这个Space就永远定死了。想做个改键功能不好意思你得自己搞一套映射表然后所有读取输入的地方都改成查表。项目大了以后这基本是灾难。第二设备支持全靠自己撞。老系统对市面上五花八门的手柄兼容性一直一般不同厂家的手柄按键映射经常对不上你写代码时根本不知道玩家的手柄会被识别成什么样。第三跨平台体验没有统一方案。同一个操作在PC上可能是键盘某个键在主机上可能是某个手柄按键在触屏上是虚拟按钮。老系统不给你一个干干净净的抽象层这活儿全得自己来。新版Input System核心解决的就是这三个问题。它把“玩家脑子里想的操作”和“你代码里拿到的输入”彻底解耦。你在代码里关心的不再是什么物理按键而是跳跃这个动作是不是被触发了。至于跳跃在PC上绑定空格、在Switch上绑定手柄A键那是配置文件和Asset的事代码根本不关心。补充一点官方文档对设计动机讲得很细如果你打算深入学习先去看那篇Overview比看任何教程都重要。2. 环境准备与新旧系统切换的真实操作先别急着写代码第一步是把项目环境切过去。很多人装完Package发现老接口还能用新接口也出现了立刻陷入混乱。这里我要给你一套明确的路子。1.1 安装新版Input System Package在Unity的菜单栏打开Window - Package Manager搜索Input System安装最新稳定版本。注意如果项目里之前装了老版本Unity会弹警告说项目里同时存在新旧两套输入系统会冲突这时候千万别头铁直接勾选两个都用那是给平滑迁移用的临时状态不是让你长期用的。正确做法是让Unity自动帮你把Active Input Handling切换到Input System Package (New)然后重启编辑器。如果不重启一些生成代码和程序集引用不会正确刷新后面会出现各种奇怪报错。装完之后你会发现在Project Settings里多了一个专门的输入系统区域同时菜单栏多出一个Assets - Create - Input Actions选项。这个Input Actions资产文件就是整个新系统的核心配置所在。1.2 理解输入处理的模式切换后果把Active Input Handling从旧模式切到新模式后有一个比较隐蔽的变化老接口的Input.GetKey这些方法会直接不能用而且不是编译报错是运行时直接异常或者返回空值。所以如果你项目很大、一时半会儿搬不完我给你的中间方案是在Project Settings里选择Both也就是两个系统同时启用。但你要明白这只是苟且之策会带来双倍的内存开销和输入处理开销而且某些平台上会有输入重叠的诡异Bug。我的建议是——新项目直接用新模式老项目搬迁要定一个明确的完成节点不要无限期Both下去。另外主线程这一点很多人会忽略。新系统的输入事件默认不会自动丢到主线程里你如果用了方式监听输入回调回调可能发生在后台线程。处理这种回调时想调用Unity API比如修改Transform、访问对象池就会报player loop is not running这类错。官方的标准解法是在Update轮询事件队列或者用ExecuteCommandBuffer不过日常开发最简单靠谱的做法是在回调里只做标记到Update里再处理。3. 核心概念真要理解透不是光看名字就行的新系统这套概念体系说实在的初次接触的人很容易在术语里迷路。Action、Action Map、Binding、Control、Interaction看着名字能猜个大概但真正串起来用总会差点意思。我挨个给你过一遍顺便讲讲每个概念为什么必须存在。2.1 Action就是个“动作”的抽象InputAction是你最常打交道的东西。跳跃、移动、开枪这些都能做成一个Action。它有点像电子设备上的电源键——你按下去设备只知道自己被“唤醒”根本不关心电源键内部怎么实现。同理Action不关心键盘还是手柄它只定义了一个动作可能的输入值。这个值可以是数字比如按压力度、向量比如摇杆坐标、布尔比如按下/抬起取决于你配置的Action Type。Action Type有三种Button、Value和PassThrough。很多人搞不清它们的区别我举几个场景跳跃这种只要“触发没触发”的用Button。跑动这种需要方向和大小的用Value它会做平滑处理和按需复位。如果是鼠标移动这种高频流式数据你不想让它有缓冲和延迟用PassThrough。它不会缓存也不会等触发完成来什么给你什么。这三个类型看着简单实际用起来决定了很多调试体验。最典型的坑是给移动方向配了Value类型但摇杆解除后方向没有归零角色会一直朝一个方向走。这是因为Value类型默认有复位延迟机制你需要在Action的Properties里把Initial State设为0或者在代码里处理取消操作。2.2 Action Map是“场景”的划分一个游戏不可能只有一个动作你在主菜单可能是“按A开始”在战斗时是“按A攻击”在对话时“按A跳过”。这些场景最容易出现“同一按键在不同状态下干不同事”的需求。Action Map就是这个场景的划分器。你可以建一张Map叫Gameplay里面放着移动、跳跃、射击这些动作。再建一张Map叫UI里面放着导航、确认、取消。运行时切到UI场景就激活UI这张Map切回战斗就激活Gameplay。同名的Action可以存在于不同Map里互不干扰。一个小设计心得Map不是越多越好每张Map都有额外的运行时内存和查找开销建议按交互模式分别按关卡分。2.3 Binding是真实设备上的“触角”Binding就是把Action接到具体设备具体按钮上。比如跳跃这个Action我给它的Binding列表里加了一条键盘空格再加一条手柄南键。这样不管是键盘玩家还是手柄玩家跳跃Action都会在对应设备被触发。你要记住一个Action可以绑很多条Binding任何一个被触发Action就触发。这个“或”的关系很重要做多设备支持就靠它。但Binding里还有个坑多个设备同时存在时系统会默认用“最后一次使用的设备”来决定输入结果。也就是说你键盘手柄都插着玩家碰了一下键盘随后摇手柄就可能会有一两帧没反应。这是新系统的Point模式导致的通常只会造成约几毫秒的既有延迟但你要是做对Timing极敏感的格斗游戏需要考虑在Project Settings里调整Input Settings - Device的优先级策略。2.4 Interactions是输入“花样”的定义Interactions这个概念比较容易被新手跳过但它是新系统里隐藏的高手向功能。它决定了一个输入行为如何被解释成动作。比如你想实现“双击闪避”、“按住蓄力”、“极短按是轻击、长按是重击”这些以前要自己写计时或计数器的玩法现在通通可以通过在Action上添加Interaction来完成。特别注意Tap、Hold、MultiTap这几个内置交互配合Duration和Press Point参数可以调出很多手感细节。比如盾反的时机窗口其实完全可以由这个交互参数来调节。我自己试过用来做长按阅读有奇效比自己在Update里记时间干净得多。4. 实战拆解从头配一套角色移动控制系统光聊概念不落地等于纸上谈兵。我们拿一个第三人称角色的基础移动控制来完整走一遍流程过程中我会标注哪些地方容易踩坑、参数为什么这么调。3.1 创建并配置Input Actions资产在Assets面板右键Create - Input Actions命名PlayerControls。双击打开编辑器你会看到左侧是Action Maps列表中间是Action列表右侧是Inspector和Binding列表。第一步建Map。点击新建Action Map命名Gameplay。第二步建Action。在Gameplay里新建两个Action一个叫Move类型设成ValueControl Type选Vector2一个叫Jump类型设成Button。第三步绑定设备。选中Move这个Action在右侧Properties - Binding下添加Binding把Path改成Gamepad/LeftStick再添加一条Binding改成Keyboard/WASD这里系统默认会给你拆成四个独立Binding分别对应W/A/S/D这是把按键组合成Vector2的正确做法看起来啰嗦但别乱删。对于JumpAction添加Binding列表时直接在搜索框里输入Space和Gamepad/ButtonSouth这样自动绑出来。很多新手这时会困惑为啥Move的Binding里WASD拆成四个手柄却只一条原因是键盘没有“摇杆”这种连续输入WASD必须靠四个按键组合成方向而手柄的摇杆在硬件上就带给向量了。系统替你做了这个拼接代码里拿到的依然是一个干净的Vector2。3.2 让C#代码生成器帮你把错别字都挡在门外在Input Actions资产处于选中状态下看Inspector顶部有一个Generate C# Class的选项勾上它然后点Apply。系统会自动生成一个同名的C#类文件。这一步以前没做是很多人觉得新系统写代码别扭的原因因为你要用字符串去访问Action写错一个名字编译期根本发现不了。生成类以后你的代码就会变成强类型化的_playerControls.Gameplay.Move.ReadValueVector2()如果名字打错编译直接报错。这体验对大型项目来说太重要了。不过生成类有个值得注意的点自动生成的类是非sealed的它默认挂在MonoBehaviour上的调度模式是“每次Update自动更新状态”。这意味着如果你在FixedUpdate里读这个值会拿到上一帧的缓存或者当前帧尚未更新的数据。我们做角色移动物理和移动通常放在FixedUpdate里会出现一个比较隐蔽的“输入滞后”。解决方式我个人常用的是在Update里做输入检测标记等FixedUpdate里实现移动时消费这个标记。如果嫌麻烦可以考虑在Action对应的事件里直接读写这样事件一来就是你需要的时刻。3.3 事件驱动还是轮询驱动别一上来就选错新系统写代码主要分两派思路。一派是“事件驱动”也就是给Action注册performed、started、canceled回调另一派是“轮询驱动”也就是直接在代码里ReadValue。事件驱动适合不连续的动作比如跳跃、开火、互动这类“按一下响一声”的操作。代码里这样写private PlayerControls _controls; private void OnEnable() { _controls new PlayerControls(); _controls.Gameplay.Enable(); _controls.Gameplay.Jump.performed OnJump; } private void OnDisable() { _controls.Gameplay.Jump.performed - OnJump; _controls.Gameplay.Disable(); } private void OnJump(InputAction.CallbackContext context) { _playerAnimator.SetTrigger(Jump); }这里有个非常重要的细节OnEnable里订阅、OnDisable里退订。因为每帧都执行Update的生命周期里如果你在Awake订阅但忘记在OnDestroy退订对象被销毁后回调依然可能被触发轻则空引用重则内存泄漏。Unity的MonoBehaviour组件销毁不等于InputAction事件的引用自动解除。轮询驱动适合连续量比如移动轴、视角旋转因为这类输入你希望在每一帧都能拿到即时绝对位置。代码如下private Vector2 _moveInput; private void Update() { _moveInput _controls.Gameplay.Move.ReadValueVector2(); } private void FixedUpdate() { _playerRigidbody.linearVelocity new Vector3(_moveInput.x, 0f, _moveInput.y) * _moveSpeed; }注意FixedUpdate和Update的帧率差异问题如果直接用_controls.Gameplay.Move.ReadValue在FixedUpdate里调用数据出来的状态你始终会比当前物理帧“旧”一帧。这也是很多移植到新系统的人反应“手感变肉”的原因之一。建议的方式是Update读值FixedUpdate消费。3.4 使用PlayerInput组件还是纯代码调用除了纯代码上面这套用法还有一种更偏可视化编辑的做法在玩家角色身上挂PlayerInput组件把刚才生成的Input Actions资产拖进去然后组件会自动识别出Action Map、绑定事件。这种方式适合原型验证、快速Demo因为你在Editor里就能看到哪些Action被绑定并不用写代码做绑定。但你很快会碰壁事件的传递在组件内部是通过SendMessage或UnityEvent的机制处理的性能上比直接订阅回调差不少而且组件自动生成的C#事件代码一旦命名不统一查找起来很痛苦。我的倾向是做原型验证用PlayerInput组件点几下鼠标就能看到效果特别爽。进正式开发换成生成C#类手动订阅回调更可控也更高效。这种“先组件后代码”的思路是我自己项目里踩过一遍后的经验。别一上来就组件也别一上来就全代码看项目阶段和团队习惯。5. 老项目平滑迁移旧Input Manager代码怎么分批替换现在你手头可能有个老项目代码里一搜全是Input.GetKey、Input.GetAxis。全删重写很不现实这里给你一套分批处理方案。4.1 先立一个输入处理适配层在新系统全面接入之前我推荐先封装一个自己的输入管理静态类或单例。比如我习惯做的ManualInputHandler它内部用新系统读取输入对外暴露类似IsJumpPressed()、GetMoveVector()这样的方法。然后老代码逐个文件改把Input.GetKey替换成对这个适配层的调用。这样能保证每次改动都是很小的局部变化不会一改改出上百个编译错误。不过要注意适配层一旦当中间层持续太久它自己就会变成技术债。建议限制这个过渡期的时长最好一到两个迭代内彻底把老代码清理干净然后适配层也可以直接拆掉露出新系统原生API。4.2 老接口和新接口共存时的判断策略如果你非常确定某个模块的老接口很难用新系统直接替代那在Project Settings里保留Both模式的前提下这段老代码是还能跑的。但你得自己写清楚注释这个模块为什么不能搬、什么时候搬、由谁负责。任何输入处理代码没有注释过三个月你一定忘记当初的迁移动机。一个小经验不急着一次性把所有代码全剪干净先让游戏能跑再去逐个模块替换。我一直认为输入系统的切换是少数适合走着瞧的大重构因为它的影响面横跨所有交互绝对没有可能一次完成。6. 常见问题与排查技巧实录这部分都是实际项目里反复出现的坑我按出现频率从高到低给你排好。每个都给了排查思路和解法遇到问题可以直接查表。问题典型原因解决方案新系统启用后旧代码报空引用Active Input Handling没切成新系统Settings里检查输入模式重启编辑器手柄完全没反应手柄驱动或设备没被识别打开Input Debugger查看设备列表尝试重新插拔键盘手柄输入同时存在时偶尔卡顿设备优先级叠加导致切换配置点模式或主动设置默认设备按键名称找不到比如左Shift对Overloaded的路径不熟用编辑器里Binding路径的搜索键盘按键别自己猜名字移动方向Y轴震动或漂移手柄死区没调在Binding的Processors里加Stick Deadzone或用默认的死区器按下按键时无法跳跃弹起事件被消费查看Interactions是否设置为Tap, 手动改为Press设置触发PressOnlyUI导航按钮同时唯一点不中事件系统Mouse和UI冲突配置UI输入模块并检查Tracked Device是否为鼠标锁帧时序错乱、手感滞后Update里读值但物理在FixedUpdate消费改成Update读、FixedUpdate消费模式生成C#类后修改资产配置丢了未点Apply每次改配置记得Apply才会重新生成不然新改动不会进代码5.1 新老系统切换后UI按钮失灵怎么排查这是所有迁移的人几乎必然撞上的问题。新版Input System和Unity的EventSystem的衔接方式变了你的Canvas上那个Standalone Input Module默认是走老输入的。切到新系统之后它根本接收不到点击事件整个UI像是坏死了一样。解法是把Canvas对象上的Standalone Input Module移除改成新系统的Input System UI Input Module组件。同时检查EventSystem对象上是否有同名组件有的直接删掉换成新组件就完事。还有一个小坑Input System UI Input Module在Inspector里有一堆参数默认的Move Deadzone是0.2手柄摇杆推得轻一点UI里的选中项可能完全不移动如果嫌自己的手柄方向不好用把这值调低到0.1以下即可。5.2 OpenVR、XRI这些扩展包和老代码怎么共存有VR项目的朋友会多一个烦恼新版Input System和OpenVR、XR Interaction Toolkit这些包经常打架。尤其是XR设备自带的控制器老系统识别到了新系统可能完全不识别。我的建议是这样优先检查Project Settings里有没有把设备支持相关选项打开XR相关包都有一堆兼容选项默认不全开。别交叉用两套系统去读同一个设备的输入。一旦用新系统读手柄就别想在老接口里同时读到同一只手柄的数据这会导致双写冲突。VR项目里摄像头控制和动作控制尽量都走新系统的action asset或者用一个自己能看的懂的中间层别让程序员每次写逻辑还要猜输入是从哪来的。5.3 常见Debug工具的使用习惯新版Input System自带一个Debug工具菜单栏的Window - Analysis - Input Debugger。里面能实时看到所有设备的输入状态、Action的状态、触发的行为。这套工具如果你没用起来排查问题基本靠瞎猜。我推荐在设置Action的初期就开着它。它有几种视图Device看设备原生的输入数据流可以判断到底是硬件没识别还是Action没配好。Actions看你当前所有Action的实时状态你能看到哪个Action被触发、当前值多少、绑定到哪个设备上。Controls可以查看具体控件发送的值和中断情况。我惯用的排查流程是如果某个输入没反应先看Device里这个设备有没有动再有设备数据但没有Action数据说明是Action配置问题。如果两者都有Action也有值但游戏逻辑没反应那就是代码调用时机或事件订阅的问题。这样一条线查下去基本没有查不出来的问题。调试器里还有一个Activity条可以看到帧率下发生的输入事件数如果数量过高不是你给Action绑太多Binding就是设备本身漂移该检查硬件了。7. 个人经验与工程建议新系统的学习曲线比旧接口陡是事实但一旦跨过概念门槛后面收益非常大。我想给你几个工程上的建议都是从我自己项目里踩出来的第一别在代码里到处new InputAction。输入资产本身做成一个全局共享的实例整个项目只用一份。每次new一次就多一份绑定、多一份内存开销大量重复的时候性能影响非常明显。第二Action的命名规范一定要有约束。它是字符串容易写错也容易飘。我见过不少项目里有个叫Fire的还有叫Shoot的甚至还有FireWeapon的查起来真的很崩溃。项目一开始就定一个命名风格比如动词开头、驼峰式中文团队可以统一英文然后代码里只能通过生成的强类型类访问禁止字符串路径直接传给API。第三多给自己留调试物理按键的快捷键。有条件的话在Editor里做一个自定义编辑器窗口列出当前所有Action的Reference和当前状态。给你的策划用策划自己就能看出来哪个按键被哪个动作吃掉了不用每次都拉程序去查真的省心太多。再说一个大多数人一开始都没注意到的事新系统里同一个Action允许有多个Binding多个Binding一起触发时它有一个权重计算逻辑。如果你发现手柄和键盘同时输入时行为不是你想要的那样“谁后碰听谁的”那就是这个权重在起作用。具体权重可以在Action的Inspector里调整没有界面上的可视化权重你想精确控制的话需要写代码。这个功能对复杂的多人本地游戏来说极其重要几行代码就能解决分裂感的交互感受。还有新系统对移动端的支持也比老系统舒服得多。虚拟摇杆和触摸点击这些常用操作在Input Action编辑器里可以直接绑定不需要自己写事件检测。我做过一个移动端原型触屏和蓝牙手柄同时可用用新系统总共多加了十几行代码这个体验在老系统时代是完全不敢想的。最后提一下拓展方向。如果你打算做动作游戏或者对输入时序要求很高的玩法官方新出的Input System1.8以上版本有些针对低延迟的优化值得深挖。还有就是那些开源的Rebinding UI包能很快做出一套键位重映射界面省掉大把写UI的时间。如果你正在搬迁的路上卡住了我希望这篇文章能帮你把思路理清楚。输入系统这种底层的玩意要么不换要换就一次换干净拖着两边都用最后头痛的还是自己。

相关新闻

webview 中 cursor:pointer 无效?先查 -webkit-app-region 的拖拽区域

webview 中 cursor:pointer 无效?先查 -webkit-app-region 的拖拽区域

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 22:07:27 阅读更多 →
Java毕业设计避坑指南:SSM养老院系统联调与演示实战

Java毕业设计避坑指南:SSM养老院系统联调与演示实战

简介:本资源是一套基于SSM框架开发的Java毕业设计项目——养老院管理系统,面向计算机专业本科生及Java初学者,解决养老机构信息化管理中的多角色协同、健康与服务流程数字化等实际问题。压缩包共1462个文件,87.59MB,涵…

2026/10/18 22:07:27 阅读更多 →
从 Claude Code 到 OpenCode:多 Agent 多大模型协同的 API 配置与踩坑复盘

从 Claude Code 到 OpenCode:多 Agent 多大模型协同的 API 配置与踩坑复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 22:07:27 阅读更多 →

最新新闻

78B多模态大模型如何落地?InternVL2_5-78B-MPO多卡部署与省显存量化完整攻略

78B多模态大模型如何落地?InternVL2_5-78B-MPO多卡部署与省显存量化完整攻略

【免费下载链接】InternVL2_5-78B-MPO 项目地址: https://ai.gitcode.com/OpenGVLab/InternVL2_5-78B-MPO 点击查看 免费下载 InternVL2_5-78B-MPO 是一款基于 ViT-MLP-LLM 架构的开源多模态大模型,融合了 6B 视觉编码器 InternViT 与 72B 语言模型 Qwe…

2026/10/18 23:08:17 阅读更多 →
定长140字节上报协议n值解析:字段偏移、熵值定位与纯算还原

定长140字节上报协议n值解析:字段偏移、熵值定位与纯算还原

简介:这是一份阿里140-n值纯算生成逻辑的代码解析包,面向反爬虫工程师、前端加密研究者与算法学习者。包内完整呈现n值生成全链路:从自定义base64加密算法入手,逐步拆解Ye、ke、B、u四个核心数组的来源与组装规则,涵盖…

2026/10/18 23:08:17 阅读更多 →
无监督深度单应性估计:PyTorch实战与几何建模原理

无监督深度单应性估计:PyTorch实战与几何建模原理

1. 项目概述:为什么“无监督深度单应性估计”值得你花30分钟认真读完“Unsupervised Deep Homography - Pytorch实现”——这个标题里藏着计算机视觉领域一个非常典型的“理想与现实撕扯点”。单应性(Homography)是什么?简单说&am…

2026/10/18 23:08:17 阅读更多 →
AUBO i5与D435i抓取实践:手眼标定、点云分割与避坑指南

AUBO i5与D435i抓取实践:手眼标定、点云分割与避坑指南

简介:面向机械臂视觉抓取开发者的可运行源码包,整合aubo i5机械臂与Intel RealSense D435i深度相机的识别抓取实践。压缩包仅6KB,内含3个文件,以html说明与inscode工程配置为主,附带gitignore版本管理配置,…

2026/10/18 23:08:17 阅读更多 →
Agent Skill 完全指南:让 AI 智能体“一次学会,处处复用“

Agent Skill 完全指南:让 AI 智能体“一次学会,处处复用“

目录 一、 Agent Skill入门 1.1 Agent Skill 到底是什么? 1.2 Agent Skill长什么样? 1.2.1 文件架构 1.2.2 SKILL.md文件格式 (1) Frontmatter字段 (2) Body content 1.2.3 Skill Demo 二、怎么用Agent Skill? 2.1 安装Agent 2.2 …

2026/10/18 23:08:17 阅读更多 →
推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 23:07:17 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →