public static bool ReleaseAccessory(Outfit outfit, Accessory accessory, float offsetDistance = 0, RemoveActionType removeType = RemoveActionType.Undefined, bool singleUndo = true, string undoLabel = null) { if (AssetDatabase.Contains(outfit)) { Debug.LogError("Can't modify an outfit asset. Outfit must be in the scene.", outfit); return(false); } if (removeType == RemoveActionType.Undefined) { removeType = (RemoveActionType)EditorUtility.DisplayDialogComplex("Remove accessory from body?", string.Format("Remove '{0}' from '{1}'?", accessory.name, outfit.name), "Remove only", "Remove and destroy", "Do not remove"); } if (removeType == RemoveActionType.Cancel) { return(false); } undoLabel = string.IsNullOrEmpty(undoLabel) ? "Remove Accessory" : undoLabel; if (singleUndo) { Undo.IncrementCurrentGroup(); } Undo.RecordObjects(Outfit.UnsafeGetUndoObjects(outfit).ToArray(), undoLabel); var parent = accessory.transform.parent; outfit.Release(accessory); accessory.transform.parent = parent; Undo.SetTransformParent(accessory.transform, null, undoLabel); if (removeType == RemoveActionType.RemoveAndDestroy) { accessory.Destroy(DestroyType.GameObject, true); Undo.DestroyObjectImmediate(accessory.gameObject); } else if (offsetDistance > 0) { // This extra record call is needed for some reason. Otherwise only **part** of the translation // is recorded. Maybe the problem has to do with the unpartenting? Anyway, more fun with undo... Undo.RecordObject(accessory.transform, undoLabel); accessory.transform.position += outfit.transform.right * -offsetDistance; } if (singleUndo) { Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); } return(true); }