- Home /
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;
}
}
Answer by Bunny83 · Oct 05, 2011 at 07:47 PM
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);
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 :)
Your answer

Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Help Trying to translate cs to js problem with one block of code 2 Answers
Help In Making a SphereCast for 3D Tire! Working RayCast Script included! 0 Answers
How to destroy linked components when object is destroyed? 1 Answer
Using Mechanim for FP Animation - Help 0 Answers