82 lines
4.1 KiB
C++
82 lines
4.1 KiB
C++
//
|
|
// 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 <Engine/Scripting/Script.h>
|
|
#include <Engine/Core/Types.h>
|
|
|
|
#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)
|