x


Component Find and Replace: execute's fine, fails to do anything?!

I was originally writing a lot my code in Javascript (2 different scripts) but decided to switch all of them over to one C# script.

The scripts were originally called Waypoint and WaypointDual. I need to replace all instances of those two components with my script called BoardPoint.

I wrote a small script (below) to iterate through GameObjects (sequentially numbered 0 to 104 (and #a and #b in some cases (following a WaypointDual))

When I toggle the 'destroyWP' in the inspector, it toggles back off (correctly), the 'destroyed' variable toggles to true, and my log fills with 105 entries of destroyed....

Problem: They all still have an instance of Waypoint (or WaypointDual)... any ideas?



@script ExecuteInEditMode
    public var destroyWP = false;
    public var destroyed = false;
function Update () 
{
    if(destroyWP == true)
    {
        for(var i:int = 0; i < 105; i+=1)
        {
            var go = GameObject.Find(i+"");
            if(go == null)
            {
                var goA = GameObject.Find(i + "a");
                var goB = GameObject.Find(i + "b");
                goA.DestroyImmediate(GetComponent (Waypoint));
                goB.DestroyImmediate(GetComponent (Waypoint));
            }
            else
            {
                go.DestroyImmediate(GetComponent (Waypoint));
                go.DestroyImmediate(GetComponent (WaypointDual));
            }
            Debug.Log("Waypoint on Object "+i+" or "+i+" a|b should be destroyed...");
        }
        destroyWP = false;
        destroyed = true;
    }
}

more ▼

asked Oct 05 '11 at 07:30 PM

GereBear gravatar image

GereBear
1 1 2

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

1 answer: sort voted first

DestroyImmediate or Destroy are static functions and you have to provide a reference to the object you want to destroy. GetComponent on the other side is not a static function. It requires an instance of a GameObject or a Component on which it searchs for the component.

If you call GetComponent within a MonoBehaviour script it will search on the GameObject this script is attached to (it's the same as this.Getcomponent()).

        if(go == null)
        {
            var goA = GameObject.Find(i + "a");
            var goB = GameObject.Find(i + "b");
            DestroyImmediate(goA.GetComponent (Waypoint));
            DestroyImmediate(goB.GetComponent (Waypoint));
        }
        else
        {
            DestroyImmediate(go.GetComponent (Waypoint));
            DestroyImmediate(go.GetComponent (WaypointDual));
        }

Also keep in mind that DestroyImmediate ONLY works in the editor. Never use it ingame! Same rule applies the other way round: Don't use Destroy in an editor-script.

You should actually use a true editor script like this (not tested i'm a C# guy :D):

// UnityScript (JavaScript)
class DestroyWaypoints extends Editor
{
    @MenuItem ("MyMenu/DestroyWaypoints")
    static function DestroyWPs () 
    {
        for(var i:int = 0; i < 105; i+=1)
        {
            var go = GameObject.Find(i+"");
            if(go == null)
            {
                var goA = GameObject.Find(i + "a");
                var goB = GameObject.Find(i + "b");
                DestroyImmediate(goA.GetComponent (Waypoint));
                DestroyImmediate(goB.GetComponent (Waypoint));
            }
            else
            {
                DestroyImmediate(go.GetComponent (Waypoint));
                DestroyImmediate(go.GetComponent (WaypointDual));
            }
            Debug.Log("Waypoint on Object "+i+" or "+i+" a|b should be destroyed...");
        }
    }
}

btw if you just want to delete all Waypoint and WaypointDual scripts just do it that way:

var allWaypoints = FindObjectsOfType(Waypoint);
for(var Obj in allWaypoints)
    DestroyImmediate(Obj);

var allWaypointDuals = FindObjectsOfType(WaypointDual);
for(var Obj in allWaypointDuals)
    DestroyImmediate(Obj);
more ▼

answered Oct 05 '11 at 07:47 PM

Bunny83 gravatar image

Bunny83
45.2k 11 49 207

I'll try that out; even if it doesn't work quite right (i can at least figure it out from here.

FindObjectsOfType: was looking for this all morning, didn't see it, ty for that :)

Oct 05 '11 at 08:00 PM GereBear

I'm interested in what "doesn't work quite right"?

Oct 07 '11 at 12:27 PM Bunny83
(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:

x1949
x303
x6

asked: Oct 05 '11 at 07:30 PM

Seen: 463 times

Last Updated: Oct 07 '11 at 12:27 PM