// // WASDMove.cpp:WASD 控制实体移动(相机水平朝向参考,UE gameplay 语义)。 // // 移动语义分派: // - Dynamic 刚体 → 走物理速度门面(每帧喂水平速度,Y 归物理—— // 重力/跳跃不受影响;松键喂零速 = 立即停,Unity velocity 语义) // - 无刚体 → 直接平移 Transform // // 编辑器形态键位天然不冲突:RMB 按住 = 相机吃 WASD 飞行(脚本也读 // 到按键 → 同时在动,测移动时松开 RMB 即可);游戏形态 WASD 常开。 // #include #include #include #include #include #include #include #include using namespace Engine; // Input 门面(统一输入入口) namespace { class WASDMove final : public Engine::Scripting::ScriptBehavior { public: const char* Name() const override { return "WASDMove"; } void OnUpdate(float dt) override { // 位移方向 = 视线水平投影(W 前进 / A 左 / D 右),UE Scene // view 移动惯例;Y 锁 0(升降/跳跃归物理或将来扩展)。 // 键鼠查询统一走 Input 门面(脚本层零 GLFW 依赖) const glm::quat cq = App().GetRenderer() .GetEditorCamera() .GetTransform() .GetRotationQuat(); const glm::vec3 fwd = cq * glm::vec3(0.0f, 0.0f, -1.0f); const glm::vec3 right = cq * glm::vec3(1.0f, 0.0f, 0.0f); glm::vec3 move(0.0f); if (Input::IsKeyDown(Input::Key::W)) move += fwd; if (Input::IsKeyDown(Input::Key::S)) move -= fwd; if (Input::IsKeyDown(Input::Key::D)) move += right; if (Input::IsKeyDown(Input::Key::A)) move -= right; move.y = 0.0f; if (glm::length(move) > 1e-4f) { move = glm::normalize(move); } const glm::vec3 vel = move * m_Speed; if (auto* rb = TryGetComponent(); rb != nullptr && rb->bodyValid && rb->type == Engine::ECS::RigidBodyComponent::BodyType::Dynamic) { // 物理驱动:只覆写水平速度,Y 保留物理积分离散结果 //(整体喂 0 会抵消重力 → 空中物体悬浮) auto& phy = App().GetPhysics(); const glm::vec3 cur = phy.GetLinearVelocity(EntityBits()); phy.SetLinearVelocity(EntityBits(), {vel.x, cur.y, vel.z}); } else { Transform().SetPosition(Transform().GetPosition() + vel * dt); } } private: float m_Speed = 5.0f; // m/s }; ENGINE_REGISTER_SCRIPT(WASDMove) } // namespace