Fix crash when unloading scene during tick of that scene

This commit is contained in:
Wojtek Figat
2026-03-12 13:39:01 +01:00
parent 5c51652e16
commit 8318a9c1d0
4 changed files with 31 additions and 23 deletions

View File

@@ -44,7 +44,7 @@ void SceneTicking::TickData::Tick()
{
TickScripts(Scripts);
for (int32 i = 0; i < Ticks.Count(); i++)
for (int32 i = 0; i < Ticks.Count() && _canTick; i++)
Ticks.Get()[i].Call();
}
@@ -66,7 +66,7 @@ void SceneTicking::TickData::TickExecuteInEditor()
{
TickScripts(ScriptsExecuteInEditor);
for (int32 i = 0; i < TicksExecuteInEditor.Count(); i++)
for (int32 i = 0; i < TicksExecuteInEditor.Count() && _canTick; i++)
TicksExecuteInEditor.Get()[i].Call();
}
@@ -89,10 +89,8 @@ SceneTicking::FixedUpdateTickData::FixedUpdateTickData()
void SceneTicking::FixedUpdateTickData::TickScripts(const Array<Script*>& scripts)
{
for (auto* script : scripts)
{
script->OnFixedUpdate();
}
for (int32 i = 0; i < scripts.Count() && _canTick; i++)
scripts.Get()[i]->OnFixedUpdate();
}
SceneTicking::UpdateTickData::UpdateTickData()
@@ -102,36 +100,30 @@ SceneTicking::UpdateTickData::UpdateTickData()
void SceneTicking::UpdateTickData::TickScripts(const Array<Script*>& scripts)
{
for (auto* script : scripts)
{
script->OnUpdate();
}
for (int32 i = 0; i < scripts.Count() && _canTick; i++)
scripts.Get()[i]->OnUpdate();
}
SceneTicking::LateUpdateTickData::LateUpdateTickData()
: TickData(64)
: TickData(0)
{
}
void SceneTicking::LateUpdateTickData::TickScripts(const Array<Script*>& scripts)
{
for (auto* script : scripts)
{
script->OnLateUpdate();
}
for (int32 i = 0; i < scripts.Count() && _canTick; i++)
scripts.Get()[i]->OnLateUpdate();
}
SceneTicking::LateFixedUpdateTickData::LateFixedUpdateTickData()
: TickData(64)
: TickData(0)
{
}
void SceneTicking::LateFixedUpdateTickData::TickScripts(const Array<Script*>& scripts)
{
for (auto* script : scripts)
{
script->OnLateFixedUpdate();
}
for (int32 i = 0; i < scripts.Count() && _canTick; i++)
scripts.Get()[i]->OnLateFixedUpdate();
}
void SceneTicking::AddScript(Script* obj)
@@ -167,3 +159,11 @@ void SceneTicking::Clear()
LateUpdate.Clear();
LateFixedUpdate.Clear();
}
void SceneTicking::SetTicking(bool enable)
{
FixedUpdate._canTick = enable;
Update._canTick = enable;
LateUpdate._canTick = enable;
LateFixedUpdate._canTick = enable;
}