feat(engine): C++ native script system (ScriptBehavior + registry)
ScriptComponent stores only a script name string (POD, serializable); instances are reconciled by ScriptRuntime each frame (PhysicsWorld pattern): orphan/rename cleanup with OnDestroy, per-name instantiation from a file-level self-registering registry (ENGINE_REGISTER_SCRIPT), OnCreate on bind, OnUpdate after physics step on scaled dt. Engine framerate loop only sees the base interface, so future Lua/C# behaviors plug in as foreign ScriptBehavior implementations with zero engine changes. Ships a Spinner sample script and Inspector script picker.
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <Engine/Core/Log.h>
|
||||
#include <Engine/ECS/Scene.h>
|
||||
#include <Engine/Physics/PhysicsWorld.h>
|
||||
#include <Engine/Scripting/ScriptRuntime.h>
|
||||
#include <Engine/Renderer/Renderer.h>
|
||||
#include <Engine/Assets/AssetManager.h>
|
||||
#include <Engine/Vulkan/Device.h>
|
||||
@@ -102,6 +103,9 @@ namespace Engine {
|
||||
// 物理调试图元 → 渲染侧(PhysicsDebugPass 每帧上传绘制)
|
||||
m_Renderer->SetPhysicsDebugSource(&m_Physics->GetDebugFrame());
|
||||
|
||||
// 脚本生命周期(对账式,组件增删/改名即时生效)
|
||||
m_Scripts = CreateScope<Scripting::ScriptRuntime>(*m_Scene);
|
||||
|
||||
while (m_Running) {
|
||||
const auto frameStart = std::chrono::steady_clock::now();
|
||||
|
||||
@@ -121,6 +125,10 @@ namespace Engine {
|
||||
// SyncScene 对账仍跑(拖静态体照常同步)
|
||||
m_Physics->Step(frame.Dt());
|
||||
|
||||
// 脚本更新(物理之后、业务 OnUpdate 之前,Unity FixedUpdate→Update
|
||||
// 语义;吃 scaled dt——timeScale=0 暂停时 dt=0 脚本自然停摆)
|
||||
m_Scripts->Update(frame.Dt());
|
||||
|
||||
OnUpdate(frame);
|
||||
|
||||
// 延迟销毁在渲染前统一 flush,保证渲染遍历时池结构不变
|
||||
|
||||
Reference in New Issue
Block a user