news 2026/8/11 20:22:38

UE5 PCG程序化生成:基于样条线实现道路植被智能避让

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UE5 PCG程序化生成:基于样条线实现道路植被智能避让

1. 项目概述:告别手动摆树的低效时代

在虚幻引擎5(UE5)的场景制作中,尤其是开放世界或大型自然环境构建,最耗时、最令人头疼的环节之一,莫过于沿着蜿蜒的道路两侧手动摆放成千上万的树木、岩石和灌木。这不仅是个体力活,更是个精细活:你需要确保植被不会“长”在路中间,不同树种要有自然的分布和密度变化,还要处理地形起伏带来的适配问题。过去,我们要么依赖手刷,要么写复杂的蓝图脚本,效率低下且修改成本极高。

现在,情况完全不同了。UE5.2版本引入的Procedural Content Generation Framework(PCG)插件,彻底改变了这一工作流。它不是一个独立软件,而是深度集成在引擎内的强大工具集,专为程序化生成而生。结合UE蓝图系统中经典的样条线(Spline)工具,我们可以实现一种极其直观且高效的工作模式:你只需要像画草图一样,用样条线勾勒出道路的走向,PCG系统就能自动在道路两侧生成郁郁葱葱的森林,并且智能地让所有植被“避开”道路区域。

这个项目的核心价值,就是让你在5分钟内,从一张白纸或简单的地形,快速搭建出带有自然植被分布的道路景观。它解决的不仅是“快”的问题,更是“好”和“可控”的问题。通过蓝图控制样条线,你可以实时调整道路的曲率、宽度,而周围的植被会动态更新;通过PCG图表的节点化编辑,你可以精细控制不同植被的物种、密度、随机旋转和缩放,创造出毫无重复感的自然景象。无论你是独立开发者、环境美术师,还是技术美术(TA),掌握这套流程都将极大解放你的生产力,让你把精力更多地投入到创意和设计本身,而不是重复劳动上。

2. 核心工具与原理深度解析

2.1 UE5 PCG框架:程序化内容的“大脑”

PCG插件并非一个黑盒魔法。它的核心思想是基于规则和数据的节点化工作流。你可以把它理解为一个可视化的编程环境,但它的“语言”是图形节点,专门用于处理3D空间中的内容生成。

PCG图(PCG Graph)是它的核心工作单元。一个PCG图通常包含以下几个关键部分:

  1. 输入(Inputs):定义生成的“种子”或范围。最常见的是“Surface”(表面)输入,它可以接收一个静态网格体(Static Mesh)、一个地形(Landscape)或者一个由样条线定义的体积,作为生成内容的基底。
  2. 处理节点(Processing Nodes):这是逻辑发生的地方。一系列节点对输入的数据点(Points)进行变换、筛选、生成。例如,“Surface Sampler”节点可以在输入表面上按照特定密度撒点;“Transform Points”可以对这些点进行位移、旋转、缩放。
  3. 生成节点(Spawner Nodes):将处理后的数据点实例化为场景中实际的物体。“Static Mesh Spawner”节点是最常用的,它可以将每个数据点替换成你指定的静态网格体(比如一棵树、一块石头)。
  4. 输出(Output):将最终生成的结果输出到场景中,通常是一个包含所有实例的PCG体积(PCG Volume)或直接嵌入到关卡中。

在这个“道路与植被避让”的项目中,PCG扮演了“自动化植被布置系统”的角色。它的强大之处在于非破坏性工作流和动态更新。你随时可以返回PCG图,调整一个密度参数,场景中成千上万的树木会立即重新生成,无需手动删除再摆放。

2.2 蓝图与样条线:定义生成的“骨架”

如果说PCG是负责填充血肉的“大脑”,那么蓝图(Blueprint)样条线(Spline)就是定义形态和规则的“骨架”。

样条线是一种由控制点定义的平滑曲线。在UE中,你可以通过蓝图轻松创建和编辑样条线组件(Spline Component)。它的价值在于:

  • 直观:在视口中直接点击、拖拽控制点,就能画出任意形状的道路中心线。
  • 参数化:你可以轻松获取样条线上任意位置的点坐标、切线方向、上方向,这些数据是后续生成的基础。
  • 可扩展:基于样条线,可以衍生出道路网格体(通过Spline Mesh组件)、生成护栏、放置路灯等。

在这个项目中,我们使用蓝图来承载和操控样条线。创建一个蓝图Actor,为其添加一个Spline Component。这样,这条样条线就成为了一个可被放置、复制、参数化控制的独立对象。更重要的是,这个蓝图Actor可以作为PCG图的输入。PCG系统可以读取这条样条线的数据,并以其为基础进行运算。

避让逻辑的核心就源于此:PCG系统可以计算每个预生成植被点(Point)到样条线(道路)的最近距离。通过一个简单的“Filter by Range”“Density Filter”节点,我们可以轻松剔除掉那些距离道路中心线太近的点,只保留距离道路边界一定范围外的点用于生成树木。这就是“植被避让”的数学本质——基于距离的空间筛选。

2.3 工作流协同:从线条到森林的管道

整个流程是一条清晰的管道:

  1. 定义骨架:在关卡中放置或通过蓝图生成一条样条线,代表道路中心。
  2. 设定规则:在PCG编辑器中创建图表。将样条线蓝图作为“Surface”输入。
  3. 采样与处理:使用节点在样条线两侧的“表面”(实际上是一个由样条线扩展出的虚拟区域)上生成密集的点云。然后,应用“避让规则”过滤掉道路区域内的点。
  4. 实例化:将过滤后剩余的点,用“Static Mesh Spawner”节点实例化为树木、岩石的静态网格体。
  5. 随机化与优化:添加随机旋转、缩放节点,并启用PCG的实例化化渲染(如ISM/HSM),确保最终效果自然且性能高效。

这个管道的每一个环节都是可视化和可调试的。你可以在PCG编辑器中实时看到点云的分布,观察过滤前后的变化,真正做到“所见即所得”。

3. 5分钟快速实操:从零搭建避让森林

下面,我们抛开理论,直接进入实战。目标是:在5分钟内,创建一条由样条线定义的道路,并让PCG在道路两侧自动生成避让道路的树林。

3.1 第一步:启用插件与准备资产(1分钟)

首先,确保你的UE5项目(建议5.2或以上版本)已启用PCG插件。

  1. 打开编辑器,点击菜单栏的“编辑(Edit)” -> “插件(Plugins)”
  2. 在搜索框中输入“Procedural Content Generation”
  3. 勾选该插件,并重启编辑器。

资产准备:

  • 道路材质:准备一个简单的道路材质,或使用引擎自带的材质。
  • 植被模型:在内容浏览器中准备至少两种树木的静态网格体(Static Mesh)。可以从Quixel Bridge(Megascans)免费获取高质量模型,或使用引擎初学者包(Starter Content)里的树木。

3.2 第二步:创建道路样条线蓝图(2分钟)

我们将创建一个专门用于控制道路的蓝图。

  1. 在内容浏览器中右键,选择“蓝图类” -> “Actor”,命名为BP_Road_Spline
  2. 双击打开蓝图,进入组件模式。
  3. 点击“添加组件”(Add Component),搜索并添加“Spline”组件。将其重命名为RoadSpline
  4. 我们还需要道路视觉。添加一个“Spline Mesh”组件,重命名为RoadMesh。Spline Mesh组件可以沿着样条线拉伸一个静态网格体来形成路面。
  5. RoadMesh的细节面板中,为其指定一个道路静态网格体(比如一个简单的平面)和道路材质。
  6. 关键的一步:我们需要让RoadMesh跟随RoadSpline。在事件图表(Event Graph)中,我们需要编写简单的逻辑。但为了极速实现,我们可以利用蓝图构造脚本(Construction Script)。
  7. 在构造脚本中,拖出RoadSpline节点的引脚,调用“Get Spline Length”“Get Location and Tangent at Distance Along Spline”等函数,来更新RoadMesh的起始、结束位置和切线。更简单的方法是,在RoadSpline组件的细节面板中,找到“Rendering”部分,启用“Editor Spline Mesh”并指定Mesh和材质,编辑器会自动生成预览网格,但为了更稳定的运行时控制,建议使用构造脚本或简单的更新函数。

注意:对于这个快速演示,你可以暂时跳过复杂的Spline Mesh绑定,专注于PCG部分。只需确保BP_Road_Spline蓝图中有一个清晰定义的RoadSpline组件即可。道路视觉可以用一个简单的静态网格体Actor临时替代。

  1. 编译并保存蓝图。

3.3 第三步:构建核心PCG图表(2分钟)

这是最核心的一步,我们将创建一个PCG图来生成植被。

  1. 在内容浏览器右键,选择“PCG” -> “PCG Graph”,命名为PCG_Forest_Along_Road

  2. 双击打开PCG图。你会看到一个空白的图表和“输入”节点。

  3. 设置输入:我们希望用样条线蓝图作为生成范围。在“输入”节点的细节面板,将“Surface Type”设置为“Bounding Shape”。这样,输入就会期待一个定义了形状的Actor。

  4. 创建表面采样器:从节点面板拉出一个“Surface Sampler”节点,连接到输入节点。这个节点负责在输入形状的表面上“撒点”。

    • 在细节面板中,设置“Points per Squared Meter”(每平方米点数)为0.05(这是一个较低的起始密度,避免卡顿)。“Looseness”(松散度)可以设为0.8,让点分布更随机。
    • 关键设置:将“Apply Density to Points”勾选上。这允许我们后续根据属性(如距离)来动态调整点的密度。
  5. 创建样条线数据:我们需要从样条线获取距离信息。拉出一个“Get Spline Data”节点。它不需要连接上游,因为它直接从场景中我们指定的样条线Actor获取数据。

  6. 计算点到样条线的距离:拉出一个“Attribute Noise”节点,但这里我们用它来创建距离属性。更直接的方法是使用“Distance Between Points”节点?不,那是点对点。我们需要的是“点到样条线”的距离。PCG提供了“Projection”类节点。一个更通用的方法是:

    • 使用“Get Spline Data”节点输出样条线上的许多采样点。
    • 使用“Distance Between Points”节点,将“Surface Sampler”生成的点(作为Point A)与“Get Spline Data”生成的样条线采样点(作为Point B)进行计算。但这样计算的是到离散采样点的距离,不是到连续样条线的精确距离。
    • 更优方案:使用“Spline Distance”节点(如果版本支持),或者,我们可以利用“Density Filter”节点的原理。实际上,“避让”的核心是过滤。
  7. 实现避让过滤:拉出一个“Density Filter”节点,连接到“Surface Sampler”之后。

    • 在细节面板中,将“Density Mode”设置为“By Density on Attribute”
    • “Density Attribute”中,我们需要创建一个基于距离的属性。这里用一个技巧:先添加一个“Attribute Create”节点放在“Surface Sampler”之后,创建一个浮点属性,比如叫DistanceToRoad,并为其设置一个初始值(如1000)。然后,我们需要用真实的距离来覆盖它。这通常需要自定义节点或更复杂的设置。
    • 简化实现(5分钟方案):对于快速演示,我们可以采用一个近似但有效的方案:不使用精确的样条线距离,而是利用“Surface Sampler”本身的“Bounding Shape”输入。我们可以创建两个形状:一个大的范围框(用于生成森林),一个沿着样条线的细长框(代表道路)。然后让PCG在“大框减去细长框”的区域生成。但这需要更复杂的设置。
    • 实际可操作方案:为了真正在5分钟内看到效果,我们采用PCG中常见的“Point Filter”配合“Get Spline Data”的近似方法。步骤稍多,但逻辑清晰: a.Surface Sampler在大范围内撒点。 b.Get Spline Data获取样条线点云。 c. 用一个Get Attribute节点从样条线点云中获取SplineIndex或位置信息(这一步可能需要Attribute Reduce来找到最近点)。 d. 使用Distance Between Points计算每个森林点到最近样条线点的距离,结果存入新属性DistToSpline。 e. 使用Filter by Range节点,过滤掉DistToSpline属性值小于某个阈值(例如,道路宽度的一半加上安全距离,共500单位)的点。这样,距离道路太近的点就被剔除了。

    由于精确实现需要多个节点串联,对于首次接触的用户可能在5分钟内完成图表搭建有压力。因此,一个更快捷的替代方案是使用“体积(Volume)排斥”

    • 在场景中,沿着你的样条线道路,手动放置一个或多个“Box Volume”“Sphere Volume”,覆盖道路区域。
    • 在PCG图中,使用“Difference”节点。将Surface Sampler生成的原始点集作为A输入,将从一个“Volume Sampler”节点(采样你放置的排斥体积)生成的点集作为B输入。Difference节点会输出在A中但不在B中的点,即“道路外”的点。这种方法直观且无需计算距离,非常适合快速原型制作。
  8. 生成植被:经过过滤的点,就是可以放置树木的位置。拉出一个“Static Mesh Spawner”节点,连接到过滤节点的输出。

    • 在细节面板中,点击“Static Meshes”数组的加号,添加你准备好的多个树木网格体。
    • 可以调整“Rotation”“Scale”为随机范围(例如,Scale Min: 0.8, Max: 1.2;Rotation Min: 0, Max: 360),让森林看起来更自然。
  9. 连接输出:将Static Mesh Spawner连接到PCG图的“输出”节点。

  10. 保存PCG图。

3.4 第四步:在场景中组装并运行(<1分钟)

  1. 将你的BP_Road_Spline蓝图拖入关卡,在视口中调整样条线的控制点,画出一条蜿蜒的道路。
  2. 在内容浏览器中找到PCG_Forest_Along_Road资产,将其拖入关卡,放置在道路附近。这会创建一个PCG体积(PCG Volume)。
  3. 选中这个PCG体积,在细节面板中找到其PCG组件。
  4. “PCG Component”“Surface”属性中,将“Actor”指定为你刚刚放置的BP_Road_Spline蓝图实例。这意味着PCG图将以这个样条线Actor作为生成范围。
    • 如果使用“体积排斥”方案,则需要将排斥体积Actor指定给PCG图中Volume Sampler节点的“Target Actor”参数。
  5. 点击PCG组件细节面板顶部的“Generate”按钮,或者确保“Generation Trigger”设置为“Auto”,并稍微移动一下PCG体积或样条线Actor以触发自动生成。

瞬间,你会看到道路两侧自动布满了树木,而道路区域干干净净。调整样条线的形状,再次点击生成,植被分布会随之动态更新。至此,一个基础的、带植被避让的道路森林场景就在5分钟内核心里搭建完成了。

4. 蓝图样条线的进阶控制与参数化

基础功能实现后,我们可以通过蓝图,让整个系统变得更加智能和易用。核心思路是:将PCG的关键参数暴露给蓝图,并通过蓝图控制样条线,实现动态交互。

4.1 在蓝图中暴露PCG参数

我们希望在蓝图中直接调整森林的密度、树木种类权重、避让距离等,而无需每次都打开PCG图表。

  1. 创建PCG参数:在PCG_Forest_Along_Road图表中,选择关键的节点,如Surface Sampler的“Points per Squared Meter”属性,或Filter by Range的“Min/Max Range”属性。
  2. 提升为参数:在这些属性的引脚上右键,选择“Promote to Parameter”。这会在PCG图的“参数”面板中创建一个可外部控制的参数。为其起一个易懂的名字,如Forest_DensityRoad_Clearance_Radius
  3. 在蓝图中控制:回到BP_Road_Spline蓝图。我们需要让它不仅能定义道路,还能控制关联的PCG生成。
  4. BP_Road_Spline的组件中添加一个“PCG Component”。在细节面板中,将它的“PCG Graph”资产指定为PCG_Forest_Along_Road
  5. 在事件图表或构造脚本中,我们可以通过Get PCG Component->Get Graph Instance->Set Scalar Parameter等节点,来动态设置我们刚才创建的Forest_Density等参数。
  6. 更进一步,我们可以为BP_Road_Spline创建蓝图变量,如RoadWidthShouldGenerateForest,并将这些变量与PCG组件的参数绑定。这样,在关卡中选中道路蓝图,直接在细节面板修改这些自定义变量,就能实时影响森林的生成。

4.2 动态样条线与实时更新

蓝图控制样条线的强大之处在于动态性。

  • 程序化生成道路:你可以在蓝图中编写函数,根据噪声、曲线或算法自动生成样条线的控制点,创造出程序化蜿蜒的道路网络。
  • 实时编辑反馈:将PCG组件的“Generation Trigger”设置为“On Property Changed”。然后,在BP_Road_Spline的构造脚本中,在修改完样条线点(Spline Points)的位置后,调用PCG组件的“Clear PCG Data”“Generate”函数。这样,每当你在编辑器里拖拽样条线的控制点时,两侧的植被都会几乎实时地重新计算和更新,提供无与伦比的迭代速度。
  • 多段道路与交叉口:你可以创建多个BP_Road_Spline实例,让它们首尾相连或交叉。在PCG图中,可以通过“Merge”节点合并多个样条线Actor的输入,从而为复杂的道路网络统一生成植被。关键在于处理好交叉口区域的避让,可能需要更精细的距离计算或使用多个排斥体积。

4.3 性能优化与LOD设置

当树木数量成千上万时,性能至关重要。PCG与UE5的实例化渲染系统(ISM/HISM)天然集成。

  • 实例化Static Mesh Spawner节点默认会将生成的静态网格体以实例化形式渲染,大幅降低Draw Call。
  • Culling与LOD:确保你的树木模型本身带有良好的LOD(细节层次)。PCG生成的结果会继承这些LOD设置。你还可以在PCG图中添加“Prune”节点,根据距离相机的远近等因素,剔除掉不可见的实例点,进一步优化。
  • 按区域生成:对于超大型世界,可以将世界划分为网格,每个网格关联一个PCG体积和一条道路样条线段。通过蓝图或关卡流送控制PCG的生成与卸载,实现动态加载。

5. 常见问题、排查技巧与进阶思路

在实际操作中,你可能会遇到以下典型问题。这里提供排查思路和解决方案。

5.1 植被仍然出现在道路上

  • 问题原因:避让逻辑未生效或阈值设置不当。
  • 排查步骤
    1. 检查输入:确认PCG体积的“Surface”属性是否正确指向了样条线Actor。
    2. 可视化调试:在PCG图表中,在Filter by Range节点之前和之后分别插入“Debug”节点(或直接查看节点连接线上的点云预览)。观察过滤前点云是否覆盖道路,过滤后点云是否在道路区域出现“空洞”。如果没有空洞,说明过滤条件太宽松或距离计算有误。
    3. 检查距离属性:添加一个“Attribute Debug”节点,查看计算出的DistToSpline属性值是否准确。可能最近点计算有误,尝试在Get Spline Data节点中增加样条线的采样点数(“Num Points”参数)。
    4. 调整阈值:增大Filter by Range的“Min Range”值。这个值至少应为(道路视觉宽度/2 + 期望的植被与路肩空隙)。

5.2 PCG生成速度慢或导致编辑器卡顿

  • 问题原因:点云密度过高、静态网格体过于复杂、或实时更新过于频繁。
  • 优化方案
    1. 降低密度:逐步降低Surface Sampler的“Points per Squared Meter”,找到效果与性能的平衡点。对于远景或大片同类植被,密度可以很低。
    2. 分步生成:在编辑阶段,将PCG组件的“Generation Trigger”设为“Manual”,只在需要时点击“Generate”。确定最终效果后,可以烘焙(Bake)结果为静态网格体实例,以移除运行时生成开销。
    3. 简化预览:在PCG图中,可以为Static Mesh Spawner节点设置一个“Preview Mesh”,用一个简单的立方体或低面数模型代替复杂树木进行布局预览,快速调整分布规则。
    4. 使用Bounds:确保Surface Sampler的生成范围(通过输入Actor定义)不要无谓地过大。

5.3 植被分布不自然,过于均匀或机械

  • 问题原因:缺少随机性和自然变化规则。
  • 增强方案
    1. 应用噪声:在Surface Sampler之后,添加“Density Noise”“Attribute Noise”节点。将噪声模式(Noise Mode)设置为“Perlin”或“Cellular”,并调整强度和频率。这可以模拟林间空地、树丛等自然聚落现象。
    2. 分层生成:不要只用一种密度规则。创建多个并行的Surface Sampler->Filter->Spawner分支。例如,分支A生成大树(低密度、大范围避让),分支B生成小灌木(高密度、可更靠近道路)。然后用“Merge”节点合并结果。
    3. 基于坡度和高度过滤:添加“Get Landscape Data”节点获取地形信息,然后用“Filter by Range”节点剔除掉坡度太陡或海拔太高/太低的点,让植被只生长在合适的区域。

5.4 蓝图控制不生效或参数无法传递

  • 问题原因:参数名不匹配、蓝图与PCG图实例连接错误,或生成未触发。
  • 排查步骤
    1. 检查参数名:确保蓝图中Set Scalar Parameter节点输入的“Name”字符串,与PCG图中提升的参数名完全一致(包括大小写)。
    2. 检查Graph Instance:确保通过Get PCG Component->Get Graph Instance获取到了有效的PCG图实例引用。有时需要先“Generate”一次才会创建实例。
    3. 手动触发生成:在设置参数后,手动调用PCG组件的Clear PCG DataGenerate函数,确保更改被应用。

5.5 进阶思路:从道路到生态系统

掌握了基础避让后,你可以将这个系统扩展成一个完整的程序化生态系统生成器:

  • 多层植被:除了树木,增加草地、花朵、落叶层。使用不同的PCG分支,并设置它们之间的依赖关系(例如,先撒大树点,在大树点周围一定半径内,以更高密度撒灌木点)。
  • 物种分布规则:根据到道路的距离、海拔、坡度、噪声值,使用“Select by Attribute”节点为不同的点分配不同的静态网格体,实现物种的梯度分布(如路边多为灌木,森林深处多为乔木)。
  • 与地形材质交互:让PCG读取地形图层权重,只在特定的材质层(如泥土、草地)上生成对应的植被。
  • 动态季节变化:通过蓝图控制PCG参数,动态切换Static Mesh Spawner所使用的网格体(夏季茂盛模型、秋季枯黄模型、冬季积雪模型),实现场景的季节变换。

这套基于UE5 PCG和蓝图样条线的流程,其真正的威力在于它将美术的直观控制(画样条线)与程序的强大自动化(PCG规则)完美结合。它不是一个固定的工具,而是一个可任意扩展的框架。你可以从一条路、一片树林开始,逐步构建出整个程序化生成的、充满生机的虚拟世界。

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

blog-react未来路线图:即将到来的5大新特性

blog-react未来路线图&#xff1a;即将到来的5大新特性 【免费下载链接】blog-react react Ant Design 支持 markdown 的博客前台展示 项目地址: https://gitcode.com/gh_mirrors/blo/blog-react blog-react是一款基于react Ant Design开发的博客前台展示项目&#x…

作者头像 李华
网站建设 2026/8/11 20:19:36

聚名优惠码JY88 活动,COM直降30元

对于准备注册域名、搭建网站或管理域名资产的用户来说&#xff0c;域名注册平台的优惠活动往往可以降低前期使用成本。近期&#xff0c;聚名推出了JM88优惠码活动&#xff0c;新用户注册时填写优惠码&#xff0c;即可领取域名注册、域名转入、高级会员、店铺签约等多项优惠权益…

作者头像 李华
网站建设 2026/8/11 20:19:27

政务低代码平台实战④:可视化表单设计器——拖拽、合并拆分、代码生成

政务低代码平台实战④&#xff1a;可视化表单设计器——拖拽、合并拆分、代码生成 文章目录政务低代码平台实战④&#xff1a;可视化表单设计器——拖拽、合并拆分、代码生成为什么不能做固定行列设计器整体结构表格的创建和自由布局创建表格合并单元格 mc()拆分单元格 cf()控件…

作者头像 李华
网站建设 2026/8/11 20:18:19

结构光三维重建技术:多频外差法原理与应用

1. 结构光三维重建的基本原理 结构光三维测量技术近年来在工业检测、逆向工程、医疗影像等领域获得了广泛应用。这种非接触式测量方法的核心思想是通过投影特定的光栅图案到被测物体表面&#xff0c;然后通过相机捕捉变形后的图案&#xff0c;最后通过相位计算和相位展开算法重…

作者头像 李华
网站建设 2026/8/11 20:14:30

从玩具到生产:AI时代全栈开发实战解析

1. 项目概述&#xff1a;当玩具项目遇上全栈生产去年夏天&#xff0c;我在整理旧代码时发现一个被遗忘的Python小项目——用turtle模块模拟太阳系行星运行。这个当初只花了三小时写的"玩具"&#xff0c;如今在Google AI Studio和Antigravity的加持下&#xff0c;竟演…

作者头像 李华