/** * Extruding can get expensive when an object has many faces. This creates a new * pb_Object pipe by detaching the currently moving faces into a new object, then * sets that pipe in motion. */ void DetachChild() { // First order of business - stop extruding from this segment. Pause(); // DetachFacesToObject can fail, so it returns a bool with the success status. // If it fails, end this pipe tree. Otherwise, copy will be set to the new // pb_Object. pb_Object copy; if(DetachFacesToObject(pb, movingFaces, out copy)) { // Huzzah! DetachFacesToObject worked, and we now have 2 separate pb_Objects. // The first gets all the faces in movingFaces deleted, and the duplicate gets // all faces that *aren't* movingFaces deleted. child = copy.gameObject.AddComponent<Pipe>(); child.gameObject.name = "ChildPipe: " + child.gameObject.GetInstanceID(); // Let the child know who's boss. child.SetParent(this); // Aaand child inherits all the same paremeters that this branch has. child.SetSpeed(this.speed); child.SetSize(this.size); child.SetBounds(this.bounds); child.SetStretchRange(this.minimumStretchDistance, maximumStretchDistance); child.SetMaxTurns(this.maximumPipeTurns - turnCount); // Unlike the first segment, children should start with a turn. child.isTurn = true; // Now pass a reference to PipeSpawner's OnPipeFinished delegate to the child's OnPipeFinished event handler. child.OnPipeFinished += OnPipeFinished; } else { // Poop. DetachFacesToObject failed. Put this branch out of it's misery now. EndPipe_Internal(); } }