尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Unity WebGL中文输入解决方案:透明DOM覆盖层与IME输入法跟随
简介这是一份针对Unity WebGL中文输入需求的示例工程面向希望在网页端实现原生中文输入与输入法跟随的Unity开发者尤其适合在文本交互、聊天、搜索等场景中需要中文录入的WebGL项目。工程演示了通过JavaScript与Unity交互层监听键盘事件、激活浏览器输入法以及在全屏模式下动态校正输入法窗口位置的完整方案。压缩包共19个文件约17.4MB其中3个unityweb为构建后的WebAssembly资源2个js负责与浏览器输入法联动另有html入口、css样式、png图标及说明文档目录结构清晰可直接部署调试。目前已有939人学习下载。通过学习该示例可掌握跨语言通信机制、输入法跟随的坐标计算方式以及全屏切换时的边界处理思路对优化中文本地化体验有直接参考价值适合作为集成参考或二次开发底座。1. 中文输入框在 Unity WebGL 里点不出中文这个 Demo 凭什么能解决Unity WebGL 项目接入国内浏览器后第一次翻车往往是玩家改昵称或者发聊天消息UGUI/TMP 的 InputField 能弹键盘中文输入法的候选词却始终不出现。这不是引擎 bug而是 WebGL 构建下浏览器默认把 IME 事件交给了 DOM 层Unity 的画布接不住这套事件链路。这份 Demo 的核心价值是绕开 Unity 内部输入框在页面上叠一层透明 DOM Input让系统输入法候选框自然弹出同时做了输入法跟随和全屏适配。适合正在做页游、H5 活动页和 WebGL 工具型产品输入组件的人拿来即跑看完源码能直接改成自己的业务输入方案。2. 整体架构拆解C#、JSLib 与 DOM Input 三者如何协作2.1 WebGL 构建里普通 InputField 为什么成为输入法黑匣子Unity WebGL 的产物在浏览器里是一个 Canvas 加上一堆 WebAssembly 逻辑Unity 内部的 UI 并没有直接拿到操作系统输入法组合事件的能力。浏览器处理中文输入时IME 候选框依赖 input、textarea 或者 contenteditable 元素去接收composition事件而 Unity 的 InputField 并不属于这三种 DOM 元素所以拼音被拆成一串普通按键隐私最终显示出来的就是英文字母候选框则完全无影踪。这就像你对着一个黑匣子喊话黑匣子听不见你也不知道候选框该往哪儿站。这个 Demo 采用的“透明 DOM Input 覆盖层”方案核心思路不是去让 Unity 支持 IME而是把浏览器本来就支持的中文输入能力重新接回 Unity。整个过程分三步C# 拿到当前输入框在屏幕上的矩形区域通过 JSLib 创建一个透明input浏览器接管组合输入输入事件再回传给 C# 更新 Unity 里的文本。这样中文输入法不用做任何适配输入法跟随也变成了对 DOM 元素位置的管理。之所以不推荐在 WebGL 里直接调用系统输入法 API是因为 Windows、macOS、移动端各家输入法行为差异太大你没法保证每个浏览器都暴露同样的组合事件结构。反而是 DOM Input 这种最朴素的浏览器原生能力兼容面最广踩坑最少。当然代价也很直接焦点管理、层级遮挡、坐标换算、全屏后的重排这些原本由引擎包办的事情现在全部要你自己兜住。这份 Demo 的价值就是把这套兜底逻辑完整写了出来。2.2 Demo 的目录结构与消息流拉下工程后先看目录结构文件不多但每层的职责分得很清楚Assets/ ├── Plugins │ └── WebGL │ ├── ChineseInput.jslib │ └── FullScreen.jslib ├── Scenes │ └── Demo.unity └── Scripts ├── Input │ ├── ImeInputBridge.cs │ └── ImeInputHelper.cs └── UI └── FullScreenController.csChineseInput.jslib和FullScreen.jslib是 WebGL 构建时才会被编译进去的 JavaScript 桥接层。Unity 的 C# 通过[DllImport(__Internal)]声明外部方法构建时 Emscripten 会把方法调用映射到 jslib 里的同名函数。这个模式在 WebGL 插件开发里是标配属于 U3D 和浏览器之间唯一的直接通信通道。数据流可以用一条链路说清楚用户点击 Unity UI 里的输入框Unity 的 EventSystem 检测到选中对象。ImeInputBridge拿到该输入框的 RectTransform换算成屏幕坐标。C# 调 JSLib 创建透明 DOM Input并调用focus()此时系统输入法候选框被激活。DOM Input 触发input事件jslib 里通过unityInstance.SendMessage把当前值回传 C#。C# 把文本写回 TMP_InputField输入法跟随靠每帧更新矩形位置来保证。全屏切换时FullScreen.jslib 调用浏览器的 Fullscreen API再通过fullscreenchange事件通知 C# 重新计算坐标。这里最关键的一个坐标换算是方向问题。Unity 的Screen坐标原点在左下角DOM 的 CSS 坐标原点在左上角所以取到输入框四个世界角点后必须对 Y 轴做一次翻转。很多 WebGL 输入插件第一次跑起来候选框落在屏幕下半部分八成都是忘了这一步。JSLib 方法C# 引用作用关键参数ImeInput_Create(float x, float y, float w, float h)创建透明输入框并聚焦左上角坐标、宽高ImeInput_SetRect(float x, float y, float w, float h)每帧移动输入框同 CreateImeInput_Destroy()销毁并清理焦点无FullScreen_Request()进入浏览器全屏无这个目录结构对二次开发也很友好输入和全屏是解耦的你只想要中文输入就把 FullScreen 部分拆掉只想要全屏控制也不会被输入逻辑干扰。3. 核心模块实现输入法跟随是怎么做的3.1 JSLib 层创建透明 DOM Input先看ChineseInput.jslib这一段是所有输入法能力的根。注意 jslib 不是普通 JavaScript 文件它要用mergeInto(LibraryManager.library, {})的格式给 Unity 暴露外部函数mergeInto(LibraryManager.library, { ImeInput_Create: function (x, y, w, h) { if (window.__imeInput) { ImeInput_Destroy(); } var input document.createElement(input); input.type text; input.style.position fixed; input.style.left x px; input.style.top y px; input.style.width Math.max(w, 2) px; input.style.height Math.max(h, 2) px; input.style.opacity 0; input.style.background transparent; input.style.border none; input.style.outline none; input.style.zIndex 2147483647; input.setAttribute(autocomplete, off); input.setAttribute(autocorrect, off); document.body.appendChild(input); input.addEventListener(input, function () { if (window.unityInstance) { window.unityInstance.SendMessage( ImeInputBridge, SetText, input.value ); } }); input.focus(); window.__imeInput input; }, ImeInput_SetRect: function (x, y, w, h) { if (!window.__imeInput) return; window.__imeInput.style.left x px; window.__imeInput.style.top y px; window.__imeInput.style.width Math.max(w, 2) px; window.__imeInput.style.height Math.max(h, 2) px; }, ImeInput_Destroy: function () { var input window.__imeInput; if (input input.parentNode) { input.parentNode.removeChild(input); } window.__imeInput null; } });代码看起来简单细节其实都藏在样式里。position: fixed是为了让输入框始终相对于浏览器视口定位不受 Canvas 尺寸和滚动条影响。opacity: 0是隐藏视觉但保留元素结构这里不要用display: none因为部分浏览器对不可见输入框不弹 IME 面板。宽高用Math.max(..., 2)兜底避免传入 0 的时候输入框被当成不存在的元素。input事件监听是整个回传链路的入口。每次输入内容变化JS 就把最新值通过SendMessage发给场景里名为ImeInputBridge的物体。这里要特别留意 GameObject 名称和场景中的名字必须完全一致不然会报SendMessage has no receiver。Unity 模板里暴露出来的实例变量通常是unityInstance如果你改过构建模板记得同步改这里。ImeInput_SetRect是输入法跟随的关键接口。它不直接操作 Unity 内部的光标位置而是每帧把 DOM 输入框移动到 Unity 输入框当前所在的位置。浏览器看到 DOM Input 移动了IME 候选框就会跟着走到新的位置。这个方式对中文拼音、手写、语音输入都有效因为真正决定候选框位置的是 DOM 元素本身。3.2 C# 侧的位置换算与文本同步C# 侧负责把 Unity 的 UI 坐标转换成浏览器需要的 CSS 坐标。Demo 里用 TMP_InputField 做演示核心代码在ImeInputBridge.csusing System.Runtime.InteropServices; using TMPro; using UnityEngine; public class ImeInputBridge : MonoBehaviour { [DllImport(__Internal)] private static extern void ImeInput_Create(float x, float y, float w, float h); [DllImport(__Internal)] private static extern void ImeInput_SetRect(float x, float y, float w, float h); [DllImport(__Internal)] private static extern void ImeInput_Destroy(); private TMP_InputField currentField; private RectTransform currentRect; public void Open(TMP_InputField field) { currentField field; currentRect field.GetComponentRectTransform(); Rect r GetScreenRect(currentRect); ImeInput_Create(r.x, r.y, r.width, r.height); } public void Close() { currentField null; currentRect null; ImeInput_Destroy(); } private void Update() { if (currentRect null) return; Rect r GetScreenRect(currentRect); ImeInput_SetRect(r.x, r.y, r.width, r.height); } private Rect GetScreenRect(RectTransform rectTransform) { Vector3[] corners new Vector3[4]; rectTransform.GetWorldCorners(corners); Vector3 bottomLeft RectTransformUtility.WorldToScreenPoint(null, corners[0]); Vector3 topRight RectTransformUtility.WorldToScreenPoint(null, corners[2]); return new Rect( bottomLeft.x, Screen.height - topRight.y, topRight.x - bottomLeft.x, topRight.y - bottomLeft.y ); } public void SetText(string value) { if (currentField null) return; currentField.text value; currentField.caretPosition value.Length; } }GetScreenRect里的WorldToScreenPoint第二参数是 Camera。Screen Space Overlay 模式下传null是对的如果你把 UI 挂到了 Camera 模式下必须传入对应的 UI Camera否则坐标会偏差。Y 轴翻转的处理写在了Screen.height - topRight.y这行这是 DOM 坐标和 Unity 屏幕坐标最需要记住的分水岭。Update()里逐帧调ImeInput_SetRect初看觉得浪费但实际很有必要。输入框可能因为 UI 位移动画、ScrollRect 拖动、全屏切换而改变位置如果只在点击时定位一次输入法候选框就会漂移。逐帧更新量级很小浏览器塞一个样式属性完全扛得住。文本同步方面SetText每次把整个输入框内容赋给 TMP然后移动光标到末尾。Demo 场景下够用生产业务里如果聊天内容很长建议改成增量更新否则每敲一个拼音就把整段文本重建一次可能会出现光标跳动。3.3 全屏接口与坐标回算全屏部分在FullScreen.jslib。Unity WebGL 的Screen.fullScreen在浏览器里并不总是可靠最稳的方式是直接调浏览器的 Fullscreen APImergeInto(LibraryManager.library, { FullScreen_Request: function () { var canvas document.querySelector(#unity-canvas); if (!canvas) canvas document.querySelector(canvas); var container canvas.parentElement || document.body; var requestFn container.requestFullscreen || container.webkitRequestFullscreen || container.msRequestFullscreen; if (requestFn) { requestFn.call(container); } } });把全屏挂在 Canvas 的父容器上比挂在 Canvas 本身更安全因为 Unity 的输出画面有时候会带一个固定的背景容器父容器全屏才能保证铺满整个屏幕。全屏切换后 Canvas 的 CSS 尺寸会变Unity 的Screen.width和Screen.height也会更新但浏览器 DOM 坐标和 Canvas 尺寸之间不一定同步。这里需要在 JS 里监听fullscreenchange再回发 Unity 强制重算一次document.addEventListener(fullscreenchange, function () { if (window.unityInstance) { window.unityInstance.SendMessage( ImeInputBridge, OnFullscreenChanged, ); } });对应的 C# 方法只需要在当前输入框上触发一次位置更新public void OnFullscreenChanged() { if (currentRect ! null) { Rect r GetScreenRect(currentRect); ImeInput_SetRect(r.x, r.y, r.width, r.height); } }全屏状态的变量名、浏览器兼容前缀在不同浏览器里有差异建议做一层getFullscreenElement判断而不是只依赖fullscreenchange事件本身。4. 跑通 Demo构建、部署与在浏览器里验证中文输入4.1 用 Unity Editor 打开并配置构建拿到工程后先用 Unity Hub 打开注意 Editor 版本不需要完全一致Demo 用 2021.3 LTS 或 2022.3 LTS 都能直接打开。首次打开会让 TMP 弹导入提示选择导入即可。场景文件在Assets/Scenes/Demo.unity里面放了一个输入框、一个显示区域、一个全屏按钮以及挂在空物体上的ImeInputBridge和FullScreenController。构建之前先看 Player Settings 里的 WebGL 设置。调试阶段建议把 Compression Format 设为 Disabled因为 Brotli 压缩虽然体积小但本地静态服务器不一定配了正确的 Content-Encoding稍不留意就会出现白屏。发布上线时可以再切回 Brotli两者不影响 C# 和 JS 代码逻辑。构建目标选择 WebGL点击 Build And Run 会直接弹浏览器但我更推荐 Build 到目录后再用本地 HTTP 服务器跑这样方便开 DevTools 看 Network 和 Console。构建成功后会生成index.html、Build文件夹和StreamingAssets文件夹这三个部分是 WebGL 产物的完整集合。4.2 本地 HTTP 服务器运行验证构建产物不能直接双击index.html用file://协议打开浏览器的安全策略会拦截资源加载白屏不是项目问题。我在本地一般用 Python 起一个静态服务cd Build python -m http.server 8080没有 Python 的环境可以用npx serve .效果一样。访问http://localhost:8080后先看 Console 有没有报错。正常状态下应该没有任何红色报错Unity 的加载进度条出现并进入 Demo 界面。进入页面先不要急着点输入框先按一下 F12 打开开发者工具切到 Console 和 Elements 两个面板。点击输入框后Elements 面板里应当能看到一个透明的input元素被追加到了body里它有很高的 zIndex这就是 DOM 输入覆盖层已经生效的凭据。4.3 验证输入法跟随和全屏切换Demo 的验证可以按下面这个清单过一遍虽然不是自动化测试但覆盖了最容易翻车的几个点检查项操作预期结果IME 面板唤出聚焦输入框调出中文输入法候选框出现在输入框附近输入法跟随拖动 UI 面板或切换下一个输入框候选框跟随新位置中文回写输入“你好”Unity 输入框中显示“你好”焦点释放点击输入框以外区域DOM 输入框被销毁IME 面板收起全屏切换点击全屏按钮页面进入全屏输入框位置不变全屏后输入全屏状态下调出输入法候选框仍贴近输入框如果输入法候选框没有出现回到 JSLib 代码检查input.focus()是否在用户手势事件栈里被调用。Unity 的点击事件经过 Canvas 再走 SendMessage 到 C#再调 JSLib这个链路看似经过多层但本质上还在浏览器的事件循环里所以 focus 通常不会被拦截。一旦你改成异步回调、定时器延迟后再创建浏览器就会丢掉手势上下文焦点会被静默忽略。全屏按钮的测试最好放在输入框激活状态下进行也就是先点击输入框再点全屏按钮。这样可以直接验证fullscreenchange后 DOM Input 的位置是否被正确重算一次就把坐标问题暴露清楚。5. 避坑指南IME、焦点和全屏的常见问题5.1 候选框不跟随固定在屏幕角落现象中文能输入但输入法候选框一直在屏幕左上角或底部不跟着输入框走。原因DOM Input 的宽高是 0或者没有使用position: fixed浏览器无法把 IME 候选框绑定到一个有效元素上。另一个常见原因是ImeInput_SetRect没被调用输入框位置变化后 DOM Input 还在原地。解决JSLib 里创建输入框时用Math.max(w, 2)保证最小尺寸样式必须显式写position: fixed。C# 侧确认Update()里持续调ImeInput_SetRect不要只在点击时定位一次。如果输入框有位移动画需要等动画结束后再重算一次坐标否则候选框会残留在中途位置。5.2 透明输入框把鼠标点击挡住了现象打开输入法后输入框下方或旁边的按钮点击无响应像是被什么东西隔了一层。原因DOM Input 虽然透明但它真实地占据着页面上的一个矩形区域并且在这个区域内拦截了所有鼠标事件。解决按需设置pointer-events。创建输入框时保持默认值让浏览器能接收点击和键盘事件失焦销毁时直接从 DOM 移除。如果业务上有“输入框边缘紧贴按钮”的布局可以只把输入框尺寸收敛到文本区域内部而不是铺满整个背景。还有一个更简单的兜底方案在页面根元素上监听pointerdown如果点击目标不是当前输入框立即调用ImeInput_Destroy。5.3 全屏后输入框位置错位半个屏幕现象正常窗口下中文输入一切正常点全屏按钮后DOM Input 和 Unity 输入框不在同一个位置。原因全屏切换的瞬间浏览器视口尺寸变了但 Unity 的Screen.width和Screen.height还没更新完C# 在旧尺寸下做了坐标翻转。如果你用的是WorldToScreenPoint(null)在 Canvas 使用 Camera 模式时这个 null 值会让坐标换算基准丢失。解决监听fullscreenchange后不要立即重算用yield return null等一帧让 Unity 完成内部尺寸同步。Camera 参数要传 UI 实际使用的相机。再检查全屏容器的 CSS确保它设置了width: 100%; height: 100%否则 Canvas 内容会被拉伸世界角点本身就不正确。5.4 中文输入时 Enter 会误触发送现象输入拼音时按 Enter 上屏候选词结果业务逻辑把这个 Enter 当成发送直接 dispatch 了一串拼音。原因中文输入法在组合过程中产生的 Enter 键属于 IME 确认键但 keydown 事件依然会冒泡到页面层。只监听input事件时看不出来一旦你加了键盘提交逻辑就会翻车。解决在 JSLib 里维护一个组合状态标记compositionstart时置为 truecompositionend时置为 falsevar isComposing false; input.addEventListener(compositionstart, function () { isComposing true; }); input.addEventListener(compositionend, function () { isComposing false; }); input.addEventListener(keydown, function (e) { if (e.key Enter isComposing) { e.preventDefault(); return; } // 这里再走业务提交逻辑 });这个标记的维护必须在 DOM Input 创建时同步注册销毁时跟着一起释放。很多输入插件只处理了input事件漏了 composition 事件导致中文输入法下的 Enter 行为像一个玄学问题其实根源就这一行标记的事。5.5 编辑器里运行直接报错找不到 __Internal现象在 Unity Editor 里点 PlayConsole 报DllNotFoundException: __Internal或者直接提示外部方法无法解析。原因[DllImport(__Internal)]只在 WebGL 构建时生效Editor 运行环境根本没有这个 DLL。这个 P/Invoke 定义写出来就是为了让 Emscripten 在构建阶段寻找 jslib 同名函数。解决所有 JSLib 桥接方法套上#if UNITY_WEBGL !UNITY_EDITOR并给 Editor 模式提供空实现#if UNITY_WEBGL !UNITY_EDITOR [DllImport(__Internal)] private static extern void ImeInput_Create(float x, float y, float w, float h); #else private static void ImeInput_Create(float x, float y, float w, float h) { Debug.Log($[Editor] IME input at {x},{y}); } #endifEditor 模式下的空实现不会触发真正的浏览器输入法但能让整个业务流程先跑通。调试 UI 交互时不需要每次都构建到浏览器省下大量等待时间。这套条件编译结构也是后续扩展 JS 插件的标准模板每加一个外部方法就照着写一遍。6. 二次开发要点把输入法 Demo 变成业务输入组件6.1 从单例改成输入框注册表Demo 里的ImeInputBridge一次只服务一个输入框这在单场景演示里没问题真实业务页面上可能同时存在昵称框、搜索框、聊天框。我会先把单例逻辑改成注册表用 EventSystem 的当前选中物体来决定服务哪个输入框每个输入框在OnFocus时注册自己失焦后由桥接层统一销毁 DOM Input。这样用户从一个输入框直接点到另一个输入框时不需要先失焦再聚焦DOM Input 可以原地切换位置。6.2 补上 Composition 语义和文本校验Demo 的SetText是纯赋值生产环境需要叠加两个能力一是最大长度限制JS 回传的字符串要先在 C# 侧按业务规则截断否则只依赖 TMP 的 character limit 会出现回退不一致二是 Enter 提交语义接住上一章说的isComposing标记把 text 回调包装成SubmitText事件让业务侧只关心最终字符串不用分辨中间组合过程。public void SetText(string value) { if (currentField null) return; if (maxLength 0 value.Length maxLength) { value value.Substring(0, maxLength); } currentField.text value; currentField.caretPosition value.Length; }6.3 移动端兜底和失焦清理移动端浏览器对opacity: 0的输入框有更严格的可见性要求我会保留一个textarea的切换开关某些 iOS 版本下 textarea 的 IME 唤起更稳定。失焦清理必须做两层Unity 侧的OnApplicationFocus(false)和 JS 侧的blur事件同时监听防止用户切走浏览器标签页后 DOM Input 仍悬浮在页面上。从那以后我每次封装 WebGL 输入组件都强制把“中文组合输入 全屏切换 跨页面失焦”这三条路径走一遍才算验收过。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

cpython源码解读

cpython源码解读

下载源码 git clone https://github.com/python/cpython.git切换到的tag看源码,以3.13.0为例 git checkout tags/v3.13.0几个重要的对象/宏 路径Objects\是标准库的实现,都是C代码。如Objects\listobject.c是Pythonlist成员函数的实现,Object…

📅 2026/10/23 3:11:35
微信小程序招聘系统后端:SSM打底+SpringBoot可升级架构设计

微信小程序招聘系统后端:SSM打底+SpringBoot可升级架构设计

简介:这是一套完整的微信小程序求职招聘系统后端源码与配套前端实现,面向Java Web开发初学者及毕业设计学生,解决校园场景下兼职岗位供需匹配、身份分级管理与轻量级在线交互的实际需求。资源包含SSM框架实现的Java后台(含44个Jav…

📅 2026/10/23 3:11:35
ISO 8800解读:AI错误分类学与安全需求推导如何守护自动驾驶

ISO 8800解读:AI错误分类学与安全需求推导如何守护自动驾驶

简介:ISO PAS 8800是国际标准化组织(ISO)发布的道路车辆安全与人工智能技术规范草案,正式编号为ISO/CD PAS 8800:2023(E),由ISO/TC 22/SC 32工作组制定,面向车辆制造商、AI系统开发者与安全监管机构&#x…

📅 2026/10/23 3:06:34
MORE NEWS

更多资讯

📰

上下文在烧钱?用asm stats --tokens算清每个技能的token成本,找回AI代理注意力预算

【免费下载链接】asm The universal skill manager for AI coding agents. 项目地址: https://gitcode.com/gh_mirrors/asm17/asm 点击查看 免费下载 asm(agent-skill-manager) 是面向 AI 编码代理的通用技能管理器,它的一条核心…

📰

认识Wan2.2-Animate-2-14B-Distilled-Diffusers:阿里巴巴开源AI角色动画视频生成模型完整指南

人工智能大模型媒体生成视频多模态 【免费下载链接】Wan2.2-Animate-2-14B-Distilled-Diffusers 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-Animate-2-14B-Distilled-Diffusers 点击查看 免费下载 Wan2.2-Animate-2-14B-Distilled-Diffusers 是阿…

📰

Path of Building PoE2 完整入门指南:天赋、装备与离线伤害计算一次讲清

Path of Building PoE2 完整入门指南:天赋、装备与离线伤害计算一次讲清 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 在《流放之路2》里点错天赋、刷错词缀、练废一个角色,代价…

📰

如何用 Path of Building PoE2 规划 Build:面向新手的完整 BD 规划指南

如何用 Path of Building PoE2 规划 Build:面向新手的完整 BD 规划指南 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 开一把新的《流放之路2》,你大概率会遇到这种局面&#xf…

📰

TimeLens2-2B长视频处理技巧:768帧上限、抽帧策略与性能优化清单

【免费下载链接】TimeLens2-2B 项目地址: https://ai.gitcode.com/MCG-NJU/TimeLens2-2B 点击查看 免费下载 TimeLens2-2B 是一款开源的轻量级视频多模态大模型,专为时序定位(temporal grounding)设计:给它一段视频和…

📰

3 步把旧平衡车改造成可编程双电机动力源:hoverboard-firmware-hack-FOC FOC 固件实践指南

3 步把旧平衡车改造成可编程双电机动力源:hoverboard-firmware-hack-FOC FOC 固件实践指南 【免费下载链接】hoverboard-firmware-hack-FOC With Field Oriented Control (FOC) 项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬