public static T AddGameObjectToPrefab <T>(GameObject prefabRoot, string name) where T : MonoBehaviour
        {
            GameObject instancePrefab    = (GameObject)PrefabUtility.InstantiatePrefab(prefabRoot);
            string     instanceChildName = string.Format("{0}-{1}", name, GameCreatorUtilities.RandomHash(8));
            GameObject instanceChild     = new GameObject(instanceChildName);

            instanceChild.AddComponent <T>();

            instanceChild.transform.SetParent(instancePrefab.transform);
            PrefabUtility.ReplacePrefab(instancePrefab, prefabRoot, ReplacePrefabOptions.Default);
            UnityEngine.Object.DestroyImmediate(instancePrefab);

            GameObject prefabChild = prefabRoot.transform.Find(instanceChildName).gameObject;

            prefabChild.name = name;
            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(prefabRoot));

            return(prefabChild.GetComponent <T>());
        }
        public static void RemoveGameObjectFromPrefab(GameObject prefabRoot, GameObject prefabChild)
        {
            string prefabChildName = string.Format("{0}-{1}", prefabChild.name, GameCreatorUtilities.RandomHash(8));

            prefabChild.name = prefabChildName;

            GameObject instancePrefab = (GameObject)PrefabUtility.InstantiatePrefab(prefabRoot);

            foreach (Transform instanceChildEntry in instancePrefab.transform)
            {
                if (instanceChildEntry.gameObject.name == prefabChildName)
                {
                    UnityEngine.Object.DestroyImmediate(instanceChildEntry.gameObject);
                    break;
                }
            }

            PrefabUtility.ReplacePrefab(instancePrefab, prefabRoot, ReplacePrefabOptions.ConnectToPrefab);
            UnityEngine.Object.DestroyImmediate(instancePrefab);
        }