x


How do I Remove null components ( i.e. "Missing(Mono Script)" ) via editor script?

I have made a script somewhat similar to this one: http://answers.unity3d.com/questions/5020/searching-a-project-for-missing-mono-script

But rather than just finding the null entries, I simply want to sweep through and delete them all. By that I mean remove the null references from the GameObjects's list of Components.

The documentation for GameObject.AddComponent notes that there is no such thing as RemoveComponent, requiring you to call Object.Destroy() to remove that entry. This is impossible because there is no object to Destroy.

Creating a new GameObject and adding the components of the old one to it would invalidate any references to it.

Is there a way to do this without laboriously clicking through the UI?

NEW EDIT: (in light of comments below)

Are these references to some funny objects representing a missing script that the overloaded == operator is treating as equal to null? No, because calling DestroyImmediate() does nothing, and trying to actually de-reference the pointer causes a null reference exception. It must be that there are null pointer entries in the list, and the list is not modifiable by editor script.

Here is the demonstration code:

[MenuItem("Custom/Remove Missing Script Entries")]
public static void Do() {
    foreach (Transform t in Selection.transforms) {
        Debug.Log(t.GetComponents(typeof(Component)).Length);
        foreach (Component c in t.GetComponents(typeof(Component))) {
            if (c == null){
                Debug.Log("NULL");
                // throw caution to the wind and destroy anyway!!! AHAHHAHAHAH!!!
                GameObject.DestroyImmediate(c);
                // awwww nothing happened.  still there.
            }
            else
                Debug.Log(c.GetType());
        }
    }
}
more ▼

asked Apr 15 '10 at 11:28 PM

DtBeloBrown gravatar image

DtBeloBrown
433 6 7 19

(comments are locked)
10|3000 characters needed characters left

8 answers: sort voted first

I'm currently facing a similar issue. I can grab and modify the prefab and all it's associated behaviors just fine - including adding and removing MonoBehaviors - but any MonoBehaviors with broken refrences come up as null, and trying to remove or destroy them doesn't work. As far as I can tell, it's impossible to access these MonoBehaviors from the code. I've tried every suggestion so far in this thread, but none of them have worked - Am I stuck going through and removing these by hand?

Thanks a bunch in advance.

more ▼

answered Oct 09 '11 at 10:28 PM

michaelcovert gravatar image

michaelcovert
-4 1 1 2

This is not an answer to the question asked. What you've posted is a comment.

May 12 '12 at 04:24 PM kalvinlyle
(comments are locked)
10|3000 characters needed characters left

Is there a valid solution to this yet ? I have a scene with up to a thousand objects and it will take me hours to remove a bad script that was caused from a click drag when unity chugged..... !!!!!!

more ▼

answered Apr 08 '11 at 10:55 PM

Jeston gravatar image

Jeston
419 27 31 34

Not an answer. Please post a comment instead

May 12 '12 at 04:25 PM kalvinlyle
(comments are locked)
10|3000 characters needed characters left

Mercilessly short answer: You can do this in general in an editor script by Instantiating the object (prefab/asset/whatever you wish to call it) temporarily into the currently open scene, making the desired changes to the object, then using the Editor API to save it back out by replacing the prefab (asset). After that, delete the temporary object from the scene.

more ▼

answered Sep 12 '11 at 03:35 AM

MattMaker gravatar image

MattMaker
71 1 3

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x1665
x347
x130
x1

asked: Apr 15 '10 at 11:28 PM

Seen: 4722 times

Last Updated: Feb 22 at 03:18 PM