using UnityEditor; using UnityEngine; namespace Editor { public class ItemPrefabEditorWindow : EditorWindow { private GameObject _selectedGameObject; private Interactable _interactable; private PickupItemData _pickupData; private PuzzleStepSO _objectiveData; private UnityEditor.Editor _soEditor; private string _pickupSoFolderPath = "Assets/Data/Items"; private string _puzzleSoFolderPath = "Assets/Data/Puzzles"; [MenuItem("Tools/Item Prefab Editor")] public static void ShowWindow() { var window = GetWindow("Item Prefab Editor"); window.minSize = new Vector2(400, 400); } private void OnEnable() { Selection.selectionChanged += Repaint; } private void OnDisable() { Selection.selectionChanged -= Repaint; } private void OnGUI() { _selectedGameObject = null; _interactable = null; if (Selection.activeGameObject != null) { _selectedGameObject = Selection.activeGameObject; _interactable = _selectedGameObject.GetComponent(); } else if (Selection.activeObject is GameObject go) { _selectedGameObject = go; _interactable = go.GetComponent(); } if (_selectedGameObject == null || _interactable == null) { EditorGUILayout.HelpBox("Select a GameObject or prefab with an Interactable component to edit.", MessageType.Info); return; } EditorGUILayout.LabelField("Editing: ", _selectedGameObject.name, EditorStyles.boldLabel); EditorGUILayout.Space(); // Pickup bool hasPickup = _selectedGameObject.GetComponent() != null; bool addPickup = EditorGUILayout.Toggle("Pickup", hasPickup); if (addPickup && !hasPickup) { PrefabEditorUtility.AddOrGetComponent(_selectedGameObject); } else if (!addPickup && hasPickup) { PrefabEditorUtility.RemoveComponent(_selectedGameObject); } // CombineWithBehavior bool hasCombine = _selectedGameObject.GetComponent() != null; bool addCombine = EditorGUILayout.Toggle("CombineWithBehavior", hasCombine); if (addCombine && !hasCombine) { PrefabEditorUtility.AddOrGetComponent(_selectedGameObject); } else if (!addCombine && hasCombine) { PrefabEditorUtility.RemoveComponent(_selectedGameObject); } // SlotItemBehavior bool hasSlot = _selectedGameObject.GetComponent() != null; bool addSlot = EditorGUILayout.Toggle("SlotItemBehavior", hasSlot); if (addSlot && !hasSlot) { PrefabEditorUtility.AddOrGetComponent(_selectedGameObject); } else if (!addSlot && hasSlot) { PrefabEditorUtility.RemoveComponent(_selectedGameObject); } // ObjectiveStepBehaviour bool hasObjective = _selectedGameObject.GetComponent() != null; bool addObjective = EditorGUILayout.Toggle("ObjectiveStepBehaviour", hasObjective); if (addObjective && !hasObjective) { PrefabEditorUtility.AddOrGetComponent(_selectedGameObject); } else if (!addObjective && hasObjective) { PrefabEditorUtility.RemoveComponent(_selectedGameObject); } // Pickup Data if (addPickup) { var pickup = _selectedGameObject.GetComponent(); _pickupData = pickup.itemData; EditorGUILayout.LabelField("Pickup Data:", EditorStyles.boldLabel); _pickupData = (PickupItemData)EditorGUILayout.ObjectField("PickupItemData", _pickupData, typeof(PickupItemData), false); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Save To"); EditorGUILayout.SelectableLabel(_pickupSoFolderPath, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight)); if (GUILayout.Button("Select...", GUILayout.Width(80))) { _pickupSoFolderPath = PrefabEditorUtility.SelectFolder(_pickupSoFolderPath, "Data/Items"); } EditorGUILayout.EndHorizontal(); if (_pickupData == null && GUILayout.Button("Create New PickupItemData")) { _pickupData = PrefabEditorUtility.CreateScriptableAsset(_selectedGameObject.name + "_pickup", _pickupSoFolderPath); } if (_pickupData != null) { PrefabEditorUtility.DrawScriptableObjectEditor(ref _soEditor, _pickupData); pickup.itemData = _pickupData; } } // Objective Data if (addObjective) { var obj = _selectedGameObject.GetComponent(); _objectiveData = obj.stepData; EditorGUILayout.LabelField("Objective Data:", EditorStyles.boldLabel); _objectiveData = (PuzzleStepSO)EditorGUILayout.ObjectField("PuzzleStepSO", _objectiveData, typeof(PuzzleStepSO), false); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Save To"); EditorGUILayout.SelectableLabel(_puzzleSoFolderPath, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight)); if (GUILayout.Button("Select...", GUILayout.Width(80))) { _puzzleSoFolderPath = PrefabEditorUtility.SelectFolder(_puzzleSoFolderPath, "Data/Puzzles"); } EditorGUILayout.EndHorizontal(); if (_objectiveData == null && GUILayout.Button("Create New PuzzleStepSO")) { _objectiveData = PrefabEditorUtility.CreateScriptableAsset(_selectedGameObject.name + "_puzzle", _puzzleSoFolderPath); } if (_objectiveData != null) { PrefabEditorUtility.DrawScriptableObjectEditor(ref _soEditor, _objectiveData); obj.stepData = _objectiveData; } } if (GUI.changed) { EditorUtility.SetDirty(_selectedGameObject); PrefabUtility.RecordPrefabInstancePropertyModifications(_selectedGameObject); } } } }