feat: expand editor scripting asset and viewport flow

This commit is contained in:
2026-04-03 13:22:30 +08:00
parent ed8c27fde2
commit a05d0b80a2
124 changed files with 10397 additions and 1737 deletions

View File

@@ -63,8 +63,19 @@ void ScriptEngine::SetRuntime(IScriptRuntime* runtime) {
m_runtime = runtime ? runtime : &m_nullRuntime;
}
void ScriptEngine::SetRuntimeFixedDeltaTime(float fixedDeltaTime) {
if (fixedDeltaTime > 0.0f) {
m_runtimeFixedDeltaTime = fixedDeltaTime;
return;
}
m_runtimeFixedDeltaTime = DefaultFixedDeltaTime;
}
void ScriptEngine::OnRuntimeStart(Components::Scene* scene) {
const float configuredFixedDeltaTime = m_runtimeFixedDeltaTime;
OnRuntimeStop();
m_runtimeFixedDeltaTime = configuredFixedDeltaTime;
if (!scene) {
return;
@@ -109,6 +120,7 @@ void ScriptEngine::OnRuntimeStop() {
m_runtimeScene = nullptr;
m_scriptStates.clear();
m_scriptOrder.clear();
m_runtimeFixedDeltaTime = DefaultFixedDeltaTime;
return;
}
@@ -125,6 +137,7 @@ void ScriptEngine::OnRuntimeStop() {
m_scriptOrder.clear();
m_runtimeRunning = false;
m_runtimeScene = nullptr;
m_runtimeFixedDeltaTime = DefaultFixedDeltaTime;
m_runtime->OnRuntimeStop(stoppedScene);
}
@@ -239,6 +252,33 @@ void ScriptEngine::OnScriptComponentDestroyed(ScriptComponent* component) {
StopTrackingScript(*state, false);
}
void ScriptEngine::OnScriptComponentClassChanged(ScriptComponent* component) {
if (!component) {
return;
}
if (!m_runtimeRunning) {
return;
}
if (ScriptInstanceState* state = FindState(component)) {
StopTrackingScript(*state, false);
}
if (!component->HasScriptClass()) {
return;
}
ScriptInstanceState* state = TrackScriptComponent(component);
if (!state) {
return;
}
if (ShouldScriptRun(*state)) {
EnsureScriptReady(*state, true);
}
}
bool ScriptEngine::HasTrackedScriptComponent(const ScriptComponent* component) const {
return FindState(component) != nullptr;
}
@@ -248,6 +288,45 @@ bool ScriptEngine::HasRuntimeInstance(const ScriptComponent* component) const {
return state && state->instanceCreated;
}
bool ScriptEngine::TryGetAvailableScriptClasses(
std::vector<ScriptClassDescriptor>& outClasses,
const std::string& assemblyName) const {
outClasses.clear();
std::vector<ScriptClassDescriptor> runtimeClasses;
if (!m_runtime->TryGetAvailableScriptClasses(runtimeClasses)) {
return false;
}
outClasses.reserve(runtimeClasses.size());
for (const ScriptClassDescriptor& descriptor : runtimeClasses) {
if (!assemblyName.empty() && descriptor.assemblyName != assemblyName) {
continue;
}
if (descriptor.className.empty()) {
continue;
}
outClasses.push_back(descriptor);
}
std::sort(
outClasses.begin(),
outClasses.end(),
[](const ScriptClassDescriptor& lhs, const ScriptClassDescriptor& rhs) {
if (lhs.assemblyName != rhs.assemblyName) {
return lhs.assemblyName < rhs.assemblyName;
}
if (lhs.namespaceName != rhs.namespaceName) {
return lhs.namespaceName < rhs.namespaceName;
}
return lhs.className < rhs.className;
});
return true;
}
bool ScriptEngine::TrySetScriptFieldValue(
ScriptComponent* component,
const std::string& fieldName,