DeclareParams/ParamBuilder 声明字段,运行时反射读写; Inspector 按类型生成控件,SceneSerializer 直通存取; 动画系统接入参数化裁剪;新增 OrbitMove 示例脚本
47 lines
1.6 KiB
C++
47 lines
1.6 KiB
C++
//
|
||
// OrbitMove.cpp:参数管线验证样本——实体绕中心点圆周运动。
|
||
//
|
||
// 参数全链路:DeclareParams 声明(Speed/Radius/Center)→ Inspector
|
||
// 自动出控件 → 随场景序列化 → 实例化/RefreshParams 灌值。PIE 中拖
|
||
// Radius 当帧生效;Stop 由快照天然回滚。
|
||
// 未声明成员(m_Angle)= 纯运行时状态,不进 Inspector 不落盘。
|
||
//
|
||
|
||
#include <Engine/Scripting/Script.h>
|
||
|
||
#include <glm/glm.hpp>
|
||
|
||
#include <cmath>
|
||
|
||
namespace {
|
||
|
||
class OrbitMove final : public Engine::Scripting::ScriptBehavior {
|
||
public:
|
||
const char* Name() const override { return "OrbitMove"; }
|
||
|
||
// 参数声明(Inspector 控件 + 序列化 + 灌值共用 schema)
|
||
void DeclareParams(Engine::Scripting::ParamBuilder& pb) override {
|
||
pb.Field("Speed", &m_Speed, 1.0f); // 角速度(弧度/秒)
|
||
pb.Field("Radius", &m_Radius, 3.0f); // 轨道半径
|
||
pb.Field("Center", &m_Center, glm::vec3{0.0f}); // 轨道中心
|
||
}
|
||
|
||
void OnUpdate(float dt) override {
|
||
m_Angle += m_Speed * dt;
|
||
// 直接驱动 Transform(相对父空间的圆周;无父 = 世界)
|
||
Transform().SetPosition(
|
||
m_Center + glm::vec3(std::cos(m_Angle) * m_Radius, 0.0f,
|
||
std::sin(m_Angle) * m_Radius));
|
||
}
|
||
|
||
private:
|
||
float m_Speed = 1.0f;
|
||
float m_Radius = 3.0f;
|
||
glm::vec3 m_Center{0.0f};
|
||
float m_Angle = 0.0f; // 运行时相位(非参数)
|
||
};
|
||
|
||
ENGINE_REGISTER_SCRIPT(OrbitMove);
|
||
|
||
} // namespace
|