上游 flow-shield-effect 的护盾效果主要集中在 src/components/ForceShield 内部:一个球体 mesh、一套自定义 shader 材质、动画 uniform,以及一个用于渲染点击命中冲击波的小型命中缓冲。仓库其他部分大多是为了 demo 展示服务的,包括 React Three Fiber 包装、Leva 调参、Orbit 辅助、场景组合和可选后期处理。这意味着它非常适合做“核心能力直接迁移”,但迁移后必须符合当前仓库的实现约束:
src/components/src/shader/<component-name>/src/dcsConfig.ts 完成注册和配置 schemasrc/views/previewEntry.vue 或 src/views/templateComponet.vue 里加入组件专属分支逻辑另外,上游点击冲击波来自 mesh 上的 onClick,使用本地 raycast 命中点并调用 stopPropagation()。这种写法在独立 demo 中没问题,但如果后续要放到编辑器里做场景级点选、选中或拾取,它会有明显冲突风险。
目标:
src/dcsConfig.ts 接入默认值和调参项,并把 shader 放到组件专属目录中。非目标:
position/rotation/scale 作为组件自身配置契约的一部分。radius 参数,也不引入 uRadius uniform;保持上游“固定基准球体 + shader 材质”的思路,组件整体尺寸交给宿主场景或编辑器外部 Object3D 缩放处理。ForceShield 本身就是用固定球体和材质组合出来的:外层 group 通过 scale 控整体大小,内部 sphereGeometry 使用固定参数 [1.8, 64, 64],index.tsx 中也是这么接的;shader 顶点阶段直接把 position 写入 vObjPos,片元阶段又直接使用 vObjPos.y / 1.8 和默认命中点 vec3(0, 1.8, 0) 这类固定半径假设来做计算,shaderMaterial.ts 里可以看到这一点。既然当前接入目标更接近“迁移材质表现”,就不应该平白扩展成一个额外的半径契约。备选方案:新增 radius 参数并改造为 uRadius 驱动的自适配 shader。这个方案技术上可以做,但它已经超出“按原组件思路迁移”的边界,而且你明确说明后续尺寸会由你自己在外层调整,因此首版不应走这条路。
决策:将护盾 shader 迁移为 src/shader/superEnergyShieldComponent/ 下的外部顶点和片元文件。
理由:当前仓库已经要求 shader 代码按组件拆分存放。上游实现把 shader 写在 TypeScript 辅助文件里,迁移成 .vert 和 .frag 后更便于维护,也能与现有组件实现方式保持一致。
备选方案:继续把 shader 字符串内联在 Vue 组件里。技术上可行,但不符合仓库约定,也不利于后续调试和维护。
决策:参数只保留护盾自身相关项。
保留参数:
color、opacity、showHex、hexScale、hexOpacity、edgeWidthfresnelPower、fresnelStrength、fadeStartflashSpeed、flashIntensity、flowScale、flowSpeed、flowIntensitynoiseScale、noiseEdgeColor、noiseEdgeWidth、noiseEdgeIntensity、noiseEdgeSmoothnesshitRingSpeed、hitRingWidth、hitMaxRadius、hitDuration、hitIntensity、hitImpactRadius不保留参数:
radius理由:上游 demo 暴露的参数很多,是为了实验和展示,不适合作为动态组件服务里的正式参数面。这里应该只保留真正改变护盾本体表现的配置。
备选方案:一比一迁移所有上游参数。这个方案会让配置面板过于嘈杂,也会把 demo 状态和可复用组件参数混在一起。
决策:保留命中冲击波效果,但把“生成 impact”的逻辑抽成共享入口,而不是强绑定到永远开启的点击事件上。
理由:命中冲击波是护盾效果的重要组成部分,但上游 demo 的事件处理策略不适合作为长期集成契约。应通过 registerImpact(localPoint, localNormal) 一类统一入口来驱动固定大小的命中缓冲,这样既能支持可选的组件自点击预览模式,也能兼容未来编辑器自己的拾取逻辑。
集成规则:
stopPropagation() 作为组件正常工作的前提备选方案:彻底去掉命中冲击波。这样虽然能避开事件问题,但会丢掉上游组件最有辨识度的行为之一。
决策:组件接入统一通过 src/dcsConfig.ts 完成,不改通用预览视图文件。
理由:当前仓库已经把组件默认值和配置面板集中在 src/dcsConfig.ts 中管理。超级能量盾也应该遵循同样路径。
备选方案:在通用 preview 视图里为该组件加入特判逻辑。这个方案会让公共预览层和组件能力发生耦合。
决策:组件必须完全运行在 three.js canvas 渲染管线内,不依赖后期处理才能成立。
理由:上游效果本质上是 shader 驱动的,迁移后应当在不加 bloom 或 composer 的前提下也能保持有效表现,否则在动态组件服务中嵌入会变得不稳定。
备选方案:把后期处理视为组件契约的一部分。这样会增加集成复杂度,也违反你给出的迁移边界。
radius/uRadius 契约;如果未来确实要支持几何体半径可配,再单独发起一次 shader 半径归一化改造。onClick,会和未来编辑器选中逻辑冲突。
src/dcsConfig.ts 中完成组件注册、默认值和配置面板定义。dcsConfig 注册,再回退组件和 shader 文件,最后清理相关预览资源。