I've been working on a C# DLL for a custom editor that saves its data in objects whose classes are derived from ScriptableObject. The ScriptableObjects are stored within a List<> which is a member of a script component attached to a GameObject. Everything works fairly well: objects are serialized, etc.
The problem comes when the script of one of the objects in the List is deleted from the project. Any attempt to access the List at the index where the object was at results in a hard crash to desktop from Unity.
Now you may ask, "why would you delete the script from the project"? The editor plugin is designed to search through the developer's scripts to find certain types of classes. It does this by using .NET standard stuff like Assembly.CurrentDomain.GetAssemblies and searching to find Custom Attributes or specific Types. Essentially, it's designed to be as user-friendly as Unity itself is (delete a script, and it cleans itself up).
While the EditorWindow.OnProjectChange method seems like it would be the best place to detect this, this is only called when the EditorWindow is open, and it would need to know about all of the components. In addition, it would have to perform its magic after scripts are compiled, and by that time it's already too late.
So, basically, how do I remove a reference to a ScriptableObject-derived object in a List after the Type has been removed from the project?
asked Oct 27 '10 at 08:40 AM