Move the prefab editor to a dedicated tool window
This commit is contained in:
@@ -13,5 +13,5 @@ MonoBehaviour:
|
||||
m_Name: Headband
|
||||
m_EditorClassIdentifier:
|
||||
itemName: Headband
|
||||
description: Item dropped by Uncle Kunt
|
||||
description: Item dropped by Uncle Kunt!
|
||||
mapSprite: {fileID: 743298078511449570, guid: 6f463983177b1404ca39fa222f03a3b2, type: 3}
|
||||
|
||||
@@ -1,76 +1,106 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using System.IO;
|
||||
|
||||
namespace Editor
|
||||
{
|
||||
[CustomEditor(typeof(GameObject))]
|
||||
public class ItemPrefabEditor : UnityEditor.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";
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
[MenuItem("Tools/Item Prefab Editor")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
GameObject go = (GameObject)target;
|
||||
bool isItem = go.GetComponent<Interactable>() != null;
|
||||
if (!isItem)
|
||||
var window = GetWindow<ItemPrefabEditorWindow>("Item Prefab Editor");
|
||||
window.minSize = new Vector2(400, 400);
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
DrawDefaultInspector();
|
||||
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<Interactable>();
|
||||
}
|
||||
else if (Selection.activeObject is GameObject go)
|
||||
{
|
||||
_selectedGameObject = go;
|
||||
_interactable = go.GetComponent<Interactable>();
|
||||
}
|
||||
|
||||
if (_selectedGameObject == null || _interactable == null)
|
||||
{
|
||||
EditorGUILayout.HelpBox("Select a GameObject or prefab with an Interactable component to edit.", MessageType.Info);
|
||||
return;
|
||||
}
|
||||
EditorGUILayout.LabelField("Item Prefab Editor", EditorStyles.boldLabel);
|
||||
|
||||
EditorGUILayout.LabelField("Editing: ", _selectedGameObject.name, EditorStyles.boldLabel);
|
||||
EditorGUILayout.Space();
|
||||
// Pickup
|
||||
bool hasPickup = go.GetComponent<Pickup>() != null;
|
||||
bool hasPickup = _selectedGameObject.GetComponent<Pickup>() != null;
|
||||
bool addPickup = EditorGUILayout.Toggle("Pickup", hasPickup);
|
||||
if (addPickup && !hasPickup)
|
||||
{
|
||||
PrefabEditorUtility.AddOrGetComponent<Pickup>(go);
|
||||
PrefabEditorUtility.AddOrGetComponent<Pickup>(_selectedGameObject);
|
||||
}
|
||||
else if (!addPickup && hasPickup)
|
||||
{
|
||||
PrefabEditorUtility.RemoveComponent<Pickup>(go);
|
||||
PrefabEditorUtility.RemoveComponent<Pickup>(_selectedGameObject);
|
||||
}
|
||||
// CombineWithBehavior
|
||||
bool hasCombine = go.GetComponent<CombineWithBehavior>() != null;
|
||||
bool hasCombine = _selectedGameObject.GetComponent<CombineWithBehavior>() != null;
|
||||
bool addCombine = EditorGUILayout.Toggle("CombineWithBehavior", hasCombine);
|
||||
if (addCombine && !hasCombine)
|
||||
{
|
||||
PrefabEditorUtility.AddOrGetComponent<CombineWithBehavior>(go);
|
||||
PrefabEditorUtility.AddOrGetComponent<CombineWithBehavior>(_selectedGameObject);
|
||||
}
|
||||
else if (!addCombine && hasCombine)
|
||||
{
|
||||
PrefabEditorUtility.RemoveComponent<CombineWithBehavior>(go);
|
||||
PrefabEditorUtility.RemoveComponent<CombineWithBehavior>(_selectedGameObject);
|
||||
}
|
||||
// SlotItemBehavior
|
||||
bool hasSlot = go.GetComponent<SlotItemBehavior>() != null;
|
||||
bool hasSlot = _selectedGameObject.GetComponent<SlotItemBehavior>() != null;
|
||||
bool addSlot = EditorGUILayout.Toggle("SlotItemBehavior", hasSlot);
|
||||
if (addSlot && !hasSlot)
|
||||
{
|
||||
PrefabEditorUtility.AddOrGetComponent<SlotItemBehavior>(go);
|
||||
PrefabEditorUtility.AddOrGetComponent<SlotItemBehavior>(_selectedGameObject);
|
||||
}
|
||||
else if (!addSlot && hasSlot)
|
||||
{
|
||||
PrefabEditorUtility.RemoveComponent<SlotItemBehavior>(go);
|
||||
PrefabEditorUtility.RemoveComponent<SlotItemBehavior>(_selectedGameObject);
|
||||
}
|
||||
// ObjectiveStepBehaviour
|
||||
bool hasObjective = go.GetComponent<ObjectiveStepBehaviour>() != null;
|
||||
bool hasObjective = _selectedGameObject.GetComponent<ObjectiveStepBehaviour>() != null;
|
||||
bool addObjective = EditorGUILayout.Toggle("ObjectiveStepBehaviour", hasObjective);
|
||||
if (addObjective && !hasObjective)
|
||||
{
|
||||
PrefabEditorUtility.AddOrGetComponent<ObjectiveStepBehaviour>(go);
|
||||
PrefabEditorUtility.AddOrGetComponent<ObjectiveStepBehaviour>(_selectedGameObject);
|
||||
}
|
||||
else if (!addObjective && hasObjective)
|
||||
{
|
||||
PrefabEditorUtility.RemoveComponent<ObjectiveStepBehaviour>(go);
|
||||
PrefabEditorUtility.RemoveComponent<ObjectiveStepBehaviour>(_selectedGameObject);
|
||||
}
|
||||
// Pickup Data
|
||||
if (addPickup)
|
||||
{
|
||||
var pickup = go.GetComponent<Pickup>();
|
||||
var pickup = _selectedGameObject.GetComponent<Pickup>();
|
||||
_pickupData = pickup.itemData;
|
||||
EditorGUILayout.LabelField("Pickup Data:", EditorStyles.boldLabel);
|
||||
_pickupData = (PickupItemData)EditorGUILayout.ObjectField("PickupItemData", _pickupData, typeof(PickupItemData), false);
|
||||
@@ -84,7 +114,7 @@ namespace Editor
|
||||
EditorGUILayout.EndHorizontal();
|
||||
if (_pickupData == null && GUILayout.Button("Create New PickupItemData"))
|
||||
{
|
||||
_pickupData = PrefabEditorUtility.CreateScriptableAsset<PickupItemData>(go.name + "_pickup", _pickupSoFolderPath);
|
||||
_pickupData = PrefabEditorUtility.CreateScriptableAsset<PickupItemData>(_selectedGameObject.name + "_pickup", _pickupSoFolderPath);
|
||||
}
|
||||
if (_pickupData != null)
|
||||
{
|
||||
@@ -95,7 +125,7 @@ namespace Editor
|
||||
// Objective Data
|
||||
if (addObjective)
|
||||
{
|
||||
var obj = go.GetComponent<ObjectiveStepBehaviour>();
|
||||
var obj = _selectedGameObject.GetComponent<ObjectiveStepBehaviour>();
|
||||
_objectiveData = obj.stepData;
|
||||
EditorGUILayout.LabelField("Objective Data:", EditorStyles.boldLabel);
|
||||
_objectiveData = (PuzzleStepSO)EditorGUILayout.ObjectField("PuzzleStepSO", _objectiveData, typeof(PuzzleStepSO), false);
|
||||
@@ -109,7 +139,7 @@ namespace Editor
|
||||
EditorGUILayout.EndHorizontal();
|
||||
if (_objectiveData == null && GUILayout.Button("Create New PuzzleStepSO"))
|
||||
{
|
||||
_objectiveData = PrefabEditorUtility.CreateScriptableAsset<PuzzleStepSO>(go.name + "_puzzle", _puzzleSoFolderPath);
|
||||
_objectiveData = PrefabEditorUtility.CreateScriptableAsset<PuzzleStepSO>(_selectedGameObject.name + "_puzzle", _puzzleSoFolderPath);
|
||||
}
|
||||
if (_objectiveData != null)
|
||||
{
|
||||
@@ -119,10 +149,9 @@ namespace Editor
|
||||
}
|
||||
if (GUI.changed)
|
||||
{
|
||||
EditorUtility.SetDirty(go);
|
||||
PrefabUtility.RecordPrefabInstancePropertyModifications(go);
|
||||
EditorUtility.SetDirty(_selectedGameObject);
|
||||
PrefabUtility.RecordPrefabInstancePropertyModifications(_selectedGameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user