// // WallFracture.cpp:可碎墙脚本——碎裂逻辑已提取至 FractureLib.h //(打靶场 Target 复用同一条路径),本文件只剩宿主职责: // DeclareParams 直绑 Fracture::Params(参数名/默认值与历史档位 // 逐一同名同值,旧场景不受影响) // OnCollisionEnter → Burst::TryFire(一次性保护 + 对方 Dynamic // 速度校验 + 藏墙 + Voronoi 切分 + spawn 碎片群,库内完成) // OnUpdate → Burst::Tick(施速待办 / 寿命清理 / 模型回收) // OnDestroy → Burst::Shutdown(独占碎片模型批量停飞卸载) // // 外观默认 = 砖色不透明(原观感);玻璃/发光碎片换 Target.cpp 的 // 用法(Fire 前改 Burst::look)。 // // 验收步骤:编辑器摆一堵墙(MeshRenderer = procedural://cube + // RigidBody Static Box + 挂 WallFracture,缩放即墙尺寸)→ 场景里 // 任意实体挂 TestShoot → Play → RMB 飞行瞄准墙体 → 左键射击: // 墙沿裂纹碎成不规则碎片,孔洞周边碎块小、飞散明显,边缘大块 // 塌落堆积在墙脚,若干秒后清空。 // #include #include #include "FractureLib.h" using namespace Engine; // u32/f32/i32 基础类型(历史脚本同款) namespace { // ---- 可碎墙(挂墙实体;触发后由 Burst 管一整批碎片)---- class WallFracture final : public Engine::Scripting::ScriptBehavior { public: const char* Name() const override { return "WallFracture"; } void DeclareParams(Engine::Scripting::ParamBuilder& pb) override { // Voronoi 种子数 = 碎片数(40% 在命中点半径内加密 → 孔洞 // 周边碎块小、边缘大块的玻璃碎分布;最小间距防碎片退化) pb.Field("Count", &m_P.count, 30); pb.Field("SeedRadius", &m_P.seedRadius, 0.9f); // 加密半径 m pb.Field("MinSeedDist", &m_P.minSeedDist, 0.12f); // 种子最小间距 m // 玻璃/陶瓷式碎裂(裂纹分离 + 重力塌落),非爆炸飞散: // 初速 = 命中点径向 × 距离指数衰减(近动远不动)+ 法线 // 轻微外推(剥落)+ 微弱上抛;重力是塌落的主导 pb.Field("BurstSpeed", &m_P.burstSpeed, 1.2f); // 近点径向初速 m/s pb.Field("Falloff", &m_P.falloff, 1.0f); // 距离衰减率 1/m pb.Field("NormalPop", &m_P.normalPop, 0.4f); // 法线外推 m/s pb.Field("UpBias", &m_P.upBias, 0.3f); // 上抛偏置 m/s pb.Field("Lifetime", &m_P.lifetime, 6.0f); // 碎片寿命(秒) pb.Field("MaxFragments", &m_P.maxFragments, 128); // 活碎片上限 pb.Field("MinImpactSpeed", &m_P.minImpactSpeed, 2.0f); // 触发阈值 } void OnCollisionEnter(u32 other, const glm::vec3& point, const glm::vec3& normal) override { // 触发条件在库内:对方须是活的 Dynamic 刚体且速度够快 //(过滤静止贴靠/角色轻碰——子弹/抛体必中) m_Burst.TryFire(HV(), other, point, normal); } void OnUpdate(f32 dt) override { m_Burst.Tick(HV(), dt); } // 墙销毁(PIE stop 换血 / 手动删除):碎片实体由场景清亡处理, // 独占碎片模型统一批量回收 void OnDestroy() override { m_Burst.Shutdown(HV()); } private: // 库桥接:本成员函数内可访问 protected 基类设施(App/Spawn/ // Destroy),库内只走公共 API——见 FractureLib.h HostView 注 Engine::Fracture::HostView HV() { return {App(), EntityBits(), [this](const std::string& n) { return Spawn(n); }, [this](Engine::ECS::Entity e) { Destroy(e); }}; } Engine::Fracture::Params m_P; // 参数(DeclareParams 直绑) Engine::Fracture::Burst m_Burst; // 碎片簿记 + 生命周期(look 默认砖色) }; } // namespace ENGINE_REGISTER_SCRIPT(WallFracture)