using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace GPUInstancer { // Inspired by: https://forum.unity.com/threads/replace-game-object-with-prefab.24311/ public class GPUInstancerPrefabReplacerWindow : EditorWindow { private GameObject selectedPrefab; private bool replaceNames = true; private Vector2 scrollPos = Vector2.zero; private bool showHelpText; private Texture2D helpIcon; private Texture2D helpIconActive; public static void ShowWindow() { EditorWindow window = EditorWindow.GetWindow(typeof(GPUInstancerPrefabReplacerWindow), true, "GPU Instancer Prefab Replacer", true); window.minSize = new Vector2(400, 560); } void OnGUI() { if (helpIcon == null) helpIcon = Resources.Load(GPUInstancerConstants.EDITOR_TEXTURES_PATH + GPUInstancerEditorConstants.HELP_ICON); if (helpIconActive == null) helpIconActive = Resources.Load(GPUInstancerConstants.EDITOR_TEXTURES_PATH + GPUInstancerEditorConstants.HELP_ICON_ACTIVE); EditorGUILayout.BeginHorizontal(GPUInstancerEditorConstants.Styles.box); EditorGUILayout.LabelField(GPUInstancerEditorConstants.GPUI_VERSION, GPUInstancerEditorConstants.Styles.boldLabel); GUILayout.FlexibleSpace(); GPUInstancerEditor.DrawWikiButton(GUILayoutUtility.GetRect(40, 20), "#The_Prefab_Replacer"); GUILayout.Space(10); DrawHelpButton(GUILayoutUtility.GetRect(20, 20), showHelpText); EditorGUILayout.EndHorizontal(); DrawHelpText(GPUInstancerEditorConstants.HELPTEXT_prefabReplacerIntro, true); EditorGUILayout.BeginVertical(GPUInstancerEditorConstants.Styles.box); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(); GPUInstancerEditorConstants.DrawColoredButton(new GUIContent("Replace Selection With Prefab"), GPUInstancerEditorConstants.Colors.green, Color.white, FontStyle.Bold, Rect.zero, () => { ReplaceSelectionWithPrefab(); }); GPUInstancerEditorConstants.DrawColoredButton(GPUInstancerEditorConstants.Contents.cancel, Color.red, Color.white, FontStyle.Bold, Rect.zero, () => { this.Close(); }); EditorGUILayout.EndHorizontal(); DrawHelpText(GPUInstancerEditorConstants.HELPTEXT_prefabReplacerReplaceCancel); GUILayout.Space(10); selectedPrefab = (GameObject)EditorGUILayout.ObjectField("Prefab", selectedPrefab, typeof(GameObject), false); #if UNITY_2018_3_OR_NEWER if (selectedPrefab != null && PrefabUtility.GetPrefabAssetType(selectedPrefab) != PrefabAssetType.Regular && PrefabUtility.GetPrefabAssetType(selectedPrefab) != PrefabAssetType.Variant) #else if (selectedPrefab != null && PrefabUtility.GetPrefabType(selectedPrefab) != PrefabType.Prefab) #endif selectedPrefab = null; DrawHelpText(GPUInstancerEditorConstants.HELPTEXT_prefabReplacerPrefab); replaceNames = EditorGUILayout.Toggle("Replace Names", replaceNames); DrawHelpText(GPUInstancerEditorConstants.HELPTEXT_prefabReplacerReplaceNames); GUILayout.Space(10); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GPUInstancerEditorConstants.Styles.box); GUILayout.Space(5); GPUInstancerEditorConstants.DrawCustomLabel("Selected GameObjects", GPUInstancerEditorConstants.Styles.boldLabel); DrawHelpText(GPUInstancerEditorConstants.HELPTEXT_prefabReplacerSelectedObjects); GUILayout.Space(5); scrollPos = EditorGUILayout.BeginScrollView(scrollPos); EditorGUILayout.BeginVertical(); foreach (Transform selectedTransform in Selection.transforms) { EditorGUILayout.LabelField(selectedTransform.name); } EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); } public void ReplaceSelectionWithPrefab() { Transform[] selectedTransforms = Selection.transforms; int totalCount = selectedTransforms.Length; if (selectedPrefab != null && totalCount > 0) { GameObject prefabInstance; for (int i = 0; i < totalCount; i++) { if (EditorUtility.DisplayCancelableProgressBar("GPU Instancer Prefab Replacer", "Replacing prefabs: " + i + "/" + totalCount, i / (float)totalCount)) { this.Close(); return; } Transform selectedTransform = selectedTransforms[i]; if (selectedTransform) { prefabInstance = (GameObject)PrefabUtility.InstantiatePrefab(selectedPrefab); if (!replaceNames) prefabInstance.name = selectedTransform.name; Undo.RegisterCreatedObjectUndo(prefabInstance, "GPUI Prefab Replacer"); prefabInstance.transform.parent = selectedTransform.parent; prefabInstance.transform.SetSiblingIndex(selectedTransform.GetSiblingIndex()); prefabInstance.transform.localPosition = selectedTransform.localPosition; prefabInstance.transform.localRotation = selectedTransform.localRotation; prefabInstance.transform.localScale = selectedTransform.localScale; Undo.DestroyObjectImmediate(selectedTransform.gameObject); } } EditorUtility.ClearProgressBar(); this.Close(); GUIUtility.ExitGUI(); } } public void DrawHelpText(string text, bool forceShow = false) { if (showHelpText || forceShow) { EditorGUILayout.HelpBox(text, MessageType.Info); } } public void DrawHelpButton(Rect buttonRect, bool showingHelp) { if (GUI.Button(buttonRect, new GUIContent(showHelpText ? helpIconActive : helpIcon, showHelpText ? GPUInstancerEditorConstants.TEXT_hideHelpTooltip : GPUInstancerEditorConstants.TEXT_showHelpTooltip), showHelpText ? GPUInstancerEditorConstants.Styles.helpButtonSelected : GPUInstancerEditorConstants.Styles.helpButton)) { showHelpText = !showHelpText; } } } }