Fix crash on scripting reload when using Anim Graph with custom nodes

This commit is contained in:
Wojtek Figat
2021-01-03 23:18:53 +01:00
parent c1a83662d9
commit 786f057971
2 changed files with 19 additions and 2 deletions

View File

@@ -119,8 +119,9 @@ bool AnimGraph::Load(ReadStream* stream, bool loadMeta)
// Register for scripts reloading events (only if using any custom nodes) // Register for scripts reloading events (only if using any custom nodes)
// Handle load event always because anim graph asset may be loaded before game scripts // Handle load event always because anim graph asset may be loaded before game scripts
if (_customNodes.HasItems()) if (_customNodes.HasItems() && !_isRegisteredForScriptingEvents)
{ {
_isRegisteredForScriptingEvents = true;
#if USE_EDITOR #if USE_EDITOR
Scripting::ScriptsReloading.Bind<AnimGraph, &AnimGraph::OnScriptsReloading>(this); Scripting::ScriptsReloading.Bind<AnimGraph, &AnimGraph::OnScriptsReloading>(this);
Scripting::ScriptsReloaded.Bind<AnimGraph, &AnimGraph::OnScriptsReloaded>(this); Scripting::ScriptsReloaded.Bind<AnimGraph, &AnimGraph::OnScriptsReloaded>(this);
@@ -131,6 +132,19 @@ bool AnimGraph::Load(ReadStream* stream, bool loadMeta)
return false; return false;
} }
AnimGraph::~AnimGraph()
{
// Unregister for scripts reloading events (only if using any custom nodes)
if (_isRegisteredForScriptingEvents)
{
#if USE_EDITOR
Scripting::ScriptsReloading.Unbind<AnimGraph, &AnimGraph::OnScriptsReloading>(this);
Scripting::ScriptsReloaded.Unbind<AnimGraph, &AnimGraph::OnScriptsReloaded>(this);
#endif
Scripting::ScriptsLoaded.Unbind<AnimGraph, &AnimGraph::OnScriptsLoaded>(this);
}
}
bool AnimGraph::onParamCreated(Parameter* p) bool AnimGraph::onParamCreated(Parameter* p)
{ {
if (p->Identifier == ANIM_GRAPH_PARAM_BASE_MODEL_ID) if (p->Identifier == ANIM_GRAPH_PARAM_BASE_MODEL_ID)

View File

@@ -733,7 +733,7 @@ private:
typedef void (*InitBucketHandler)(AnimGraphInstanceData::Bucket&); typedef void (*InitBucketHandler)(AnimGraphInstanceData::Bucket&);
bool _isFunction; bool _isFunction, _isRegisteredForScriptingEvents;
int32 _bucketsCounter; int32 _bucketsCounter;
Array<InitBucketHandler> _bucketInitializerList; Array<InitBucketHandler> _bucketInitializerList;
Array<Node*> _customNodes; Array<Node*> _customNodes;
@@ -751,9 +751,12 @@ public:
, _isFunction(isFunction) , _isFunction(isFunction)
, _bucketInitializerList(64) , _bucketInitializerList(64)
, _owner(owner) , _owner(owner)
, _isRegisteredForScriptingEvents(false)
{ {
} }
~AnimGraph();
public: public:
/// <summary> /// <summary>