news 2026/9/7 10:00:31

2026 AI游戏开发:用MCP协议让自然语言驱动Unity与Unreal

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026 AI游戏开发:用MCP协议让自然语言驱动Unity与Unreal

2026年做AI游戏开发,聊得最多的已经不是“用哪个大模型写代码”,而是“怎么让大模型真正摸到你的引擎”。Unity MCP、UnrealClaude、Blender MCP、蓝湖MCP这些词到处都是,但大部分人装完MCP之后,只是让AI帮忙改了几个脚本,完全没发挥出自然语言驱动游戏引擎的潜力。这篇文章我就把自己在Unity和Unreal里搭AI工具链的完整过程、踩过的坑、以及几个真正能提升效率的实操方案整理出来,给准备入局AI游戏开发的同行一个可以直接参考的路线。

我先说结论:所谓“2026 AI游戏MCP工具链”,核心不是某个单独的MCP插件,而是把MCP协议当成一条连接线,让Claude、Cursor、Copilot这类AI助手能够直接对你的Unity工程、Unreal关卡、甚至Blender里的模型说话。你只需要在对话窗口里输入“帮我把场景里所有敌人的血量改成50%,并在3D UI上显示一个滚动选人列表”,AI就能通过MCP Server调用Unity API完成修改。听起来像魔法,实际上就是一套协议加几个配置文件的组合拳。这篇文章适合已经接触过Unity或Unreal基础操作、想用AI替代重复劳动的开发者,也适合团队里负责搭研发工具的工程师,看完可以直接在项目里落地。

1. MCP协议与游戏引擎控制:先弄清AI在游戏开发里到底扮演什么角色

1.1 MCP是什么,为什么游戏引擎需要它

MCP的全称是Model Context Protocol,直译过来是“模型上下文协议”。它的定位很朴素:给大模型提供一套标准化的接口,让模型能访问工具、文件和数据。你可以把MCP理解成USB-C接口——过去每个设备都有自己的充电口,电脑、手机、耳机各充各的,现在一根线全搞定。MCP做的事情类似,它定义了AI客户端(比如Claude Code、Cursor)和AI服务端(比如Unity MCP Server、Blender MCP Server)之间的通信格式,让AI不用为每个引擎单独学一套API。

这件事在游戏引擎里尤其重要,因为引擎不是一个简单的代码仓库,它是一个集场景、资源、组件、动画、物理、灯光于一体的复杂环境。传统IDE里的AI补全只需要能读取文本,但游戏引擎里的AI需要能“看懂”场景结构,甚至直接操作编辑器。过去你想让AI在Unity里改一个对象的位置,得先把相关代码片段复制给它、让它生成代码、你再回到编辑器粘贴运行。有了MCP之后,AI可以自己调用Editor API,改完直接刷新场景,一步到位。

我见过不少团队把MCP当成“AI读代码的工具”,这其实浪费了它一大半的作用。MCP真正的价值在于它打通了“AI认知”和“引擎操作”之间的断层,让AI从“只能聊”变成“能干”。哪怕你只是让AI查一下当前场景里有多少个Light,它都需要通过MCP的接口去询问编辑器状态,而不是大模型凭训练记忆瞎猜。

1.2 从“IDE脚本自动化”到“LLM自然语言驱动引擎”的演进

回头看看游戏开发工具链的演进,你会发现这条路是必然的。最早我们用的是宏和脚本,比如在Unity里写一个Editor脚本,批量重命名资源、批量修改Prefab。然后是可视化脚本,比如Unreal的Blueprint,靠拖节点实现逻辑。到2024、2025年,AI编程工具陆续出现,但它们能做的还是“生成代码片段”,你得自己把代码放到正确的位置、自己运行。

2026年这个节点的意义在于,MCP协议开始成熟,AI工具链从“代码生成”演进到“意图执行”。你不再需要明确告诉AI“请生成一段C#代码,功能是遍历场景所有敌人”,而是可以直接说“把场景里所有敌人的血量减半”。AI会自己拆解这个意图:先调用场景查询接口找出所有带Enemy标签的对象,再遍历它们的HP属性,然后批量修改,最后刷新Inspector面板。这个过程里你可能一个代码字符都没看到,但引擎已经被改动过了。

当然,这也带来一个新的问题:AI权限变大,误操作风险也变高。以前AI顶多给你一段有bug的代码,现在它可能直接把你的场景改坏。所以后面我会专门讲一套“AI操作引擎的安全策略”,这是2026年做AI游戏开发绕不开的必修课。

2. Unity MCP:在编辑器里开一条AI直通车道

2.1 搭建Unity MCP Server,先别急着装模型

Unity侧现在社区里比较成熟的MCP方案是开源的Unity MCP Server,支持通过Claude、Cursor等MCP客户端接入。安装流程不复杂,但你得按顺序做,否则容易遇到那个经典的报错“No valid Unity Editor license found. Please activate your license”。

先说你可能会踩的坑。这个报错看着像MCP插件的问题,其实是Unity许可证的问题。很多人装了Unity后发现一直弹这个错,网上一搜全是MCP相关,其实是因为你用的是个人版许可证,但Unity Hub里的激活信息没正确写入,或者你同时开了多个Unity版本导致许可证被顶掉。解决方法是打开Unity Hub,进入菜单里的Manage Licenses,重新激活一次,确认状态显示激活成功后再打开项目。这个操作和MCP没有关系,但如果你先装MCP再处理许可证,就会觉得是MCP把Unity搞坏了。

搞定许可证之后,正式开始配置。我建议的分步操作如下:

  1. 从GitHub下载Unity MCP Server的源码或release包,按你的Unity版本选对应分支。
  2. 在Unity项目里导入该包的.unitypackage,或者用Packages/manifest.json添加Git URL依赖。
  3. 启动Unity编辑器的Play模式前,先打开Window菜单,找到MCP Server面板,开启服务监听。
  4. 在本地启动MCP Server的桥接进程,默认端口通常是11122,保持终端窗口不关闭。
  5. 在Claude Code或者Cursor里配置MCP客户端,指向本地端口,然后测试连通性。

这里我建议第一次配置时,先用最简单的文本测试。在Claude对话窗口里输入“查询当前Unity场景中有多少个GameObject,它们的名字是什么”。如果AI能返回准确的场景对象列表,说明你的MCP Server已经正常工作。

2.2 让Claude/Cursor接管Editor的几种典型操作

Unity MCP搭好之后,你能做的事就多了。我给你列几个我实际用下来最顺手的操作场景,这些也是网上那些零碎视频里反复出现但没人讲清楚的:

第一类是场景对象管理。你可以直接对AI说:“把场景中所有Tag为Enemy的对象active设为false”,或者“把所有名为Camera_Player的对象的位置归零”。MCP Server会把这些自然语言指令转换成Editor API调用,执行完还能在Console里返回执行日志。

第二类是资源导入与处理。AI可以通过MCP读取Assets目录结构、检查是否有缺失的引用、批量修改Prefab里的组件参数。比如你想把所有的UI按钮的字体统一改成某一种Font,AI能直接改Prefab的序列化数据,不用你手动逐个打开。

第三类是运行时操作和调试。你可以让AI进入Play Mode,模拟点击某个UI按钮,然后查看Console里有没有报错。也可以让AI在编辑器状态下执行某段C#测试代码,验证逻辑再写进正式代码里。这些操作特别适合跑回归测试,省去了反复手动操作引擎的时间。

不过要提醒一点,Unity MCP目前对“选中对象”这个概念的支持还不够细。你让AI修改“当前选中对象”的时候,如果编辑器里没有实际的Selection对象,AI经常返回空结果。我自己总结了一个变通方案:先让AI按名字查找对象,再对返回结果做修改,绕开Selection依赖。

2.3 自然语言驱动Unity的实战示例:批量修改场景对象并刷新UI

我用一个实际例子把上面这些操作串起来展示。假设现在场景里有一个敌方单位列表,都是名为“Enemy_01”“Enemy_02”之类的Prefab实例,每个敌人身上挂着一个EnemyHealth脚本,脚本里有maxHealth和currentHealth两个字段。需求是把所有敌人的currentHealth统一调整为maxHealth的50%,并把所有敌人名字前缀从“Enemy”改成“Monster”。

你在对话窗口里输入的指令大致可以写成:

请帮我完成以下Unity场景操作: 1. 查找场景中所有名称以Enemy开头的GameObject。 2. 对每个对象,找到EnemyHealth组件,读取maxHealth字段,将currentHealth设置为maxHealth的50%。 3. 将这些GameObject重命名,把前缀Enemy替换为Monster。 4. 操作前记录一个日志,操作完成后输出修改了多少个对象。

如果MCP通信正常,你会在编辑器Console里看到类似“Modified 12 GameObjects”的输出,场景层级面板里所有敌人都被重命名,Health组件里的值也变了。你不需要写一行C#代码,但底层执行的是完整的Editor API调用。

这个例子里有几个关键点值得展开:一是AI查询场景对象时,靠的是名称匹配而不是Tag,因为MCP返回的接口对Tag支持不稳定。二是修改字段之前最好让AI先“读取结构”,确认字段名准确,避免因为拼写问题导致运行时报MissingFieldException。三是在做批量操作时,强烈建议先让AI在编辑器模式下操作,不要进入Play Mode,否则MCP的改动可能会被运行时状态覆盖。

3. UnrealClaude:Unreal引擎的自然语言驾驶舱

3.1 “UnrealClaude”到底是什么

“UnrealClaude”不是一个官方名词,我在实际交流中发现它主要指的是“用Claude(通常在Claude Code或第三方客户端里)直接操作Unreal Engine”的一种工作方式。由于Unreal Engine的编辑器架构比Unity复杂很多,MCP相关的插件目前没有Unity生态那么成熟,但已经有了可以跑通的实验性方案。

Unreal这边自然语言驱动引擎的难点不在AI理解能力,而在引擎本身的API暴露方式。Unreal提供了C++和Blueprint两套开发体系,MCP要操作引擎,本质上是在C++层或Editor Utility层写一组能被外部进程调用的函数。当前社区的做法,大多是基于Unreal Engine原生的Remote Control API,或者用Python Editor Script插件作为桥接。

我的建议是先用Remote Control API做基础桥接。这个API原本是给数字孪生、远程控制这类场景用的,正好可以用来承接MCP指令。你通过HTTP或WebSocket把AI发出的意图传进来,然后在Unreal里执行对应的编辑或运行操作。也能用Claude Code直接操作Unreal的工程文件,让它写C++或Blueprint,但这属于“代码生成”而不是“引擎控制”,难度相对低一些。

3.2 搭建Unreal侧MCP的朴素路线

我这里给一个不依赖现成闭源插件、用现有功能拼起来也能跑的路线。这个方案适合Unreal 5.4及以上版本,底层原理是“Remote Control API + 自定义MCP Server桥接”。

第一步,在Unreal项目里启用Remote Control插件。打开Edit -> Plugins,搜索Remote Control,启用两个模块:Remote Control API和Remote Control UI。重启编辑器后,你会看到新增了Remote Control相关的窗口和工作区。这个功能原本是让你通过网页仪表盘控制场景对象,不需要写C++代码就能暴露参数。

第二步,配置MCP Server桥接进程。你可以在本地起一个Python进程,这个进程同时做两件事:一是按照MCP协议与Claude客户端通信,二是通过HTTP调用Unreal的Remote Control API。这样AI的指令经过MCP Server解析后,会转化成对Unreal的HTTP请求。

第三步,测试暴露一个场景参数。你可以在Remote Control面板里把一个Actor的Transform暴露出来,然后在Claude对话里让AI修改这个Actor的位置。如果AI能通过MCP Server把HTTP请求发到Unreal,Unreal里的Actor就会移动过去。

这个方案虽然看起来有点绕,但胜在不依赖某个非常特定的插件版本,而且官方API在持续迭代,兼容性有保障。等Unreal官方或社区把这些MCP插件打磨更成熟后再迁移,成本也不高。

3.3 让AI生成C++代码的同时操作关卡Actor

在Unreal里,自然语言驱动引擎的终极形态,是让AI既能生成C++/Blueprint代码,又能直接操作关卡里的Actor。这两件事可以一起完成,但要注意执行顺序。

我的建议是先操作,后生成代码。什么意思呢?你先让AI把需求落地到场景里,比如移动Actor位置、调低光照强度、改变角色速度变量,验证AI对场景的“理解”正确无误,再让它把对应的C++代码或Blueprint节点生成出来,保存到项目中。这样既保证了场景即所见,又留下了可复用的代码资产。

举个例子,你输入“为当前角色增加一个冲刺功能,速度提升两倍,持续3秒,冷却5秒”。Unreal侧的AI工作流会是这样:AI先通过MCP查询当前Character类,读取移动速度变量;然后按冲刺逻辑生成一段C++代码,插入到Character类中;接着调用编译工具做增量编译;最后在AI对话里告诉你它改动了哪些文件、如何绑定输入。

这里有个很实用的技巧:让Unreal项目预先配置好热编译模块。在Build.cs文件里,把模块类型设置为DevelopmentTool或UncookedOnly的包,这样AI改完C++代码,Claude可以触发UnrealBuildTool做增量编译,不用手动关掉编辑器重新编译。如果你不做这个配置,AI改完代码后编辑器不会加载,你还得手动重启,效率大打折扣。

4. 组装一套可用的AI游戏工具链:不只Unity和Unreal

4.1 为什么Unity MCP和UnrealClaude之外,还要引入Blender、MATLAB、蓝湖这些MCP

如果你只把AI接到Unity和Unreal上,那还不够完整。一个真实游戏项目的工具链是跨软件的:模型在Blender里改,UI效果图在蓝湖或MasterGo里,数值分析可能要在MATLAB里跑,代码在IDE里写。如果每个软件都只跟AI单独对话,那AI就分裂成了无数个小助手,每个都只懂一截,上下文根本无法串联。

这时候MCP协议的优势就体现出来了。它是统一标准,可以在一个对话窗口里同时挂载多个MCP Server。我实际项目里的MCP配置就同时挂了Unity MCP、Blender MCP、蓝湖MCP和文件系统MCP。效果是,我可以对AI说“把蓝湖里最新一版的主菜单UI设计图同步到Unity的UI Canvas里,资源从Blender模型库中取”,AI会分别调用蓝湖MCP读取设计标注、调用Unity MCP创建UI元素、调用文件系统MCP复制模型资源,整个流程像一个跨部门的自动化管线。

不过我不建议你一上来就全挂。每多挂一个MCP Server,AI的决策空间就大一圈,误操作概率也随之上升。我建议先挂你最频繁使用的两个:主引擎MCP(Unity或Unreal)和资产库MCP(Blender或蓝湖)。跑顺了再加第三个。

4.2 现代化C++工具链:AI生成高效Unreal代码的前提条件

聊到Unreal,就绕不开C++工具链的问题。现在社区里很多人在讨论“给KEIL配置外部的GCC工具链,这样就能获得对C++20/23特性的完整支持”这个思路,虽然这听起来像嵌入式开发的事,但背后的逻辑同样适用于Unreal AI编程。

Unreal Engine 5本身已经默认支持C++20,但如果你在代码里大量使用AI生成的东西,很快会发现一个问题:AI倾向于使用现代C++的新特性,比如concepts、ranges、span、结构化绑定等。如果编译器工具链停留在旧标准,AI生成的高质量代码根本跑不起来。所以在搭AI工具链之前,我建议先统一编译环境,优先使用支持C++23的现代编译器。这样AI生成代码时不会被旧语法限制,同时跑出来的性能也更好。

具体到Unreal项目里,你可以在引擎源码的BuildConfiguration.xml里指定新版编译器路径。换掉默认工具链后,AI生成的代码如果用了C++23特性,编译也能一次通过。这件事很多人忽略了,直到AI生成了一段很优雅的ranges代码,结果编译直接报错,才反过来折腾,浪费一整天。

4.3 一个典型工作流实测:从“敌人AI巡逻”需求到引擎场景落地

我把完整工具链放在一个具体需求里,展示一遍从自然语言到场景落地全过程。假设需求是“为当前第三人称项目添加一个敌人AI,实现简单的两点间巡逻,巡逻时面向移动方向”。

这个需求拆解下来,实际涉及了工具链里的多个环节。第一,场景布置:AI需要创建两个巡逻点,或者复用场景里已有的标记物。这一步走Unity MCP(或Unreal的Remote Control MCP),AI新建两个EmptyObject作为waypoint,设置好位置。第二,行为逻辑:AI生成一份巡逻脚本。在Unity里是C#的MonoBehaviour,在Unreal里可以是C++类或Blueprint。调用的逻辑就是让角色在两个waypoint之间循环移动。第三,动画与表现:AI通过Blender MCP检查有没有现成的行走动画资源,如果没有,就生成一个占位说明,提醒美术同学后续补充。第四,UI反馈:在角色头顶或屏幕上显示当前巡逻状态的文本,这一步通过Unity的UI MCP或蓝湖MCP拿UI标注,然后生成Canvas下的Text控件。

整条链路走完,你实际动手写的可能只是“请帮我添加一个敌人AI”这句自然语言。所有代码、资源引用、场景对象、UI生成都由AI通过MCP工具链完成。当然中间有一些参数需要你确认,比如巡逻点坐标、移动速度、是否循环等,AI会在执行前逐条询问,这样既保证执行效率,也避免理解偏差。

5. 常见问题与排查技巧实录

5.1 MCP相关高频问题速查表

我在搭建和运行这套工具链时踩了一堆坑,下面整理成速查表,大家可以直接对照排查。

问题现象可能原因排查思路解决方案
No valid Unity Editor license foundUnity许可证未激活或被顶掉打开Unity Hub查看菜单栏Manage Licenses状态重新激活许可证后再加载项目
Unity MCP Server启动失败,端口被占用之前的MCP进程没关干净执行netstat/ lsof检查11122或自定义端口占用情况杀掉残留进程,重启MCP Server
AI能对话但不能操作场景对象Unity MCP没有被正确加载到当前项目查看Unity Console内MCP插件的初始化日志重新导入UnityPackage并打开MCP Server面板
Unreal的Remote Control API连不上插件没启用或端口没暴露在Remote Control面板里确认服务状态启用Remote Control API插件并配置启用端口
AI修改的字段没生效修改的是编辑器缓存而不是实际资源查看Console是否有保存提示执行AssetDatabase.SaveAssets和Refresh操作
批量修改时执行很慢,像是卡住场景对象数量太大,AI在逐个查询查看MCP日志,统计请求数量先让AI按Tag或名称批量过滤,缩小范围
AI生成的代码引用了C++23特性但编译不过工具链版本太旧检查编译器版本和Unreal BuildConfiguration升级到支持C++23的工具链版本

这表里的核心经验就一条:大部分看起来是MCP本身的问题,其实都出在环境配置和许可授权上。不要一上来就怀疑协议有问题,先检查许可证、端口、插件启用状态这三样。

5.2 Unity编辑器日常问题的AI辅助排查

在用AI驱动Unity的过程中,我顺便发现了几个同事反复踩的高频编辑器问题。虽然是老话题,但放到AI工作流里会有新的副作用,值得单独提一下。

第一个是UI布局不刷新。你让AI修改了Vertical Layout Group的参数,但编辑器的层级面板看起来没变化。这不是AI没执行,而是UI布局组件不会在编辑器非运行态下自动重建。解决方法是让AI在执行完参数修改后,额外调用一次LayoutRebuilder.ForceRebuildLayoutImmediate,强制刷新布局。

第二个是3D UI滚动选人列表。很多人在编辑器和运行时遇到滚动列表不响应滚轮的问题。AI能帮你生成ScrollRect组件,但要提醒它把Viewport、Content、Scrollbar之间的关系设置正确,特别是Content的尺寸约束必须设为Preferred Size,否则列表永远不会滚动。

第三个是UI动态画线。让AI生成在Canvas上动态绘制折线或描边的代码时,社区方案默认使用的是LineRenderer,但LineRenderer在UI Canvas下会渲染异常。更好的方案是使用UnityEngine.UI的VertexHelper自定义绘制,或者使用UI Graphic重建顶点数据。如果你发现AI生成的动态画线在Game视图里不显示,多半就是选错了组件。

第四个是阴影问题。用MCP指导AI调整灯光和阴影之后,场景可能出现阴影闪烁或漏光。这通常和阴影距离设置、Shadow Cascades参数、以及法线朝向有关。可以让AI检查下物体本身的Mesh是否存在法线翻转,再调Project Settings里的Shadow Distance。

还有一个和移动端构建相关的:如果你的项目要发布到Android或者高版本iOS,AI可能会建议把Minimum API Level提高到API 35。这个操作在Project Settings里几秒钟搞定,但AI生成的代码如果没注意API Level兼容性,运行到低版本设备上会崩溃,所以还是得提醒AI统一使用兼容性API。

5.3 一套防止AI误操作引擎的安全习惯

最后分享几个我自己养成的安全习惯,这些是在“AI能直接操作引擎”时代必须建立的边界。

第一个习惯:所有批量修改操作前,让AI先执行一次场景快照。Unity侧可以把当前场景另存为一个临时场景文件,Unreal侧可以用源码控制先Commit一次。AI操作完,如果效果不对,直接恢复快照,比手动Ctrl+Z快得多。

第二个习惯:限制AI能访问的路径范围。很多MCP Server支持配置允许的文件路径或编辑器操作白名单。比如只允许AI访问Assets/GameLogic目录,不允许碰ProjectSettings目录。这样AI即使被误导或指令不清晰,也不会把项目配置改坏。

第三个习惯:高危操作必须二次确认。对“删除资源”“批量替换材质”“修改Prefab层级结构”这类操作,我建议在MCP Server端配置一个确认机制,或者至少让AI在执行前输出将要执行的操作清单,由你确认后再运行。别嫌麻烦,做AI工具链越久,越发现“确认”这个动作是用户对AI最有效的约束。

第四个习惯:把自然语言指令当成代码看待。你要对AI说的每句话负最终责任,所以涉及具体数值操作时,尽量用明确的数字而不是模糊的表达。比如“血量减少一半”不如“把当前血量设为最大血量的50%”安全,模糊表达在不同模型下的理解差异很大,出问题的概率也大。

最后再说一点实操体会

我在搭这套AI游戏MCP工具链的过程中,最大的体会是:别高估AI对复杂场景的单次理解能力,也别低估MCP协议给研发流程带来的改变。第一次跑通Unity MCP时,我让AI把场景里的所有球体变成红色,看着Inspector面板里一堆材质批量更换的时候,确实有种“编辑器活了”的错觉。但真正上手用了两周后,你会发现最稳定的用法还是“AI处理批量重复操作、你负责决策和验收”。

如果你想在公司或自己的项目里落地这套工具链,我的建议是从一个低风险的小任务开始,比如让AI生成一份场景对象清单或批量调整UI布局,而不是上来就让它写一段完整的战斗系统。等团队对AI操作引擎的心智模型建立起来之后,再逐步开放更高权限的MCP接口。这个过程急不得,但一旦跑顺,省下来的时间相当可观。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 9:59:34

Python实战:用AT指令与语音Modem实现自动接听电话机器人

之前刷到一个很火的“给100个野人打电话”整活视频,评论区都在玩梗,我却在想:如果反过来,一天之内真的有一百通陌生来电打进来,一个人手动接听、记录号码、统计时长,不仅累,而且大概率会漏掉关键…

作者头像 李华
网站建设 2026/9/7 9:54:41

壹牛NFT数藏系统全开源:部署实战与二次开发指南

简介:一套面向数字藏品与NFT平台开发者的全开源数藏系统源码,基于H5与APP双端设计,适合快速搭建数字艺术藏品展示、交易及盲盒玩法等场景。该系统为最新迭代版本,新增用户找回密码、短信注册实名认证、后台主图配置等功能&#xf…

作者头像 李华
网站建设 2026/9/7 9:49:40

C#实现国密算法SM2/SM3/SM4实战指南与踩坑总结

简介:面向需要在C#项目中集成国产密码算法的.NET开发者,这份资源实现了SM2非对称加密、SM3密码杂凑、SM4分组密码这三套国密算法,并提供完整的Winform界面示例,可直接用于政务系统、金融接口、企业内部数据加密等合规场景&#xf…

作者头像 李华
网站建设 2026/9/7 9:48:23

GENESIS2000菜单全解析:从入门到脚本自动化

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

作者头像 李华