From 34b2c105bd345cc43b16b16e54a9995075bf2a23 Mon Sep 17 00:00:00 2001 From: mira-pichai Date: Tue, 27 May 2025 11:34:51 -0400 Subject: [PATCH 1/5] Add ObjectTranslator component script --- ObjectTranslator.cs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 ObjectTranslator.cs diff --git a/ObjectTranslator.cs b/ObjectTranslator.cs new file mode 100644 index 0000000..c02d1de --- /dev/null +++ b/ObjectTranslator.cs @@ -0,0 +1,25 @@ +using UnityEngine; + +public class ObjectTranslator : MonoBehaviour +{ + [Header("Translate")] [SerializeField] [ContextMenuItem("Translate", nameof(TranslateObject))] + private Vector3 translation = Vector3.up; + + private void Awake() + { + Debug.Log("Awake"); + TranslateObject(); + } + + [ContextMenu("Translate Object")] + public void TranslateObject() + { + transform.Translate(translation); + } + + [ContextMenu("Reset Translation")] + public void ResetTranslation() + { + transform.position = Vector3.zero; + } +} \ No newline at end of file From fc8099b3d271df91d2ea3be2cd5cd1ba127c6f82 Mon Sep 17 00:00:00 2001 From: mira-pichai Date: Tue, 27 May 2025 11:44:24 -0400 Subject: [PATCH 2/5] Add ObjectTranslator custom Inspector script --- ObjectTranslatorInspector.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 ObjectTranslatorInspector.cs diff --git a/ObjectTranslatorInspector.cs b/ObjectTranslatorInspector.cs new file mode 100644 index 0000000..2171637 --- /dev/null +++ b/ObjectTranslatorInspector.cs @@ -0,0 +1,15 @@ +using UnityEditor; +using UnityEngine; + +[CustomEditor(typeof(ObjectTranslator))] +public class ObjectTranslatorInspector : Editor +{ + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + + var objectTranslator = (ObjectTranslator)target; + + if(GUILayout.Button("Translate Object")) objectTranslator.TranslateObject(); + } +} \ No newline at end of file From c91eb3ecd887c43db8d5f3977301163777ba6c1d Mon Sep 17 00:00:00 2001 From: mira-pichai Date: Tue, 27 May 2025 11:45:46 -0400 Subject: [PATCH 3/5] Add Object Translator custom Editor Window script (using UGUI) --- ObjectTranslatorEditorWindow.cs | 100 ++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 ObjectTranslatorEditorWindow.cs diff --git a/ObjectTranslatorEditorWindow.cs b/ObjectTranslatorEditorWindow.cs new file mode 100644 index 0000000..49fb993 --- /dev/null +++ b/ObjectTranslatorEditorWindow.cs @@ -0,0 +1,100 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +public class ObjectTranslatorEditorWindow : EditorWindow +{ + private List _objectsWithComponent; + private ObjectTranslator _objectTranslator; + + private void OnGUI() + { + // _objectsWithComponent = FindObjectsWithComponent(); + _objectsWithComponent = GetSortedObjectsWithComponent(); + + GUILayout.Label("Translate Objects", EditorStyles.boldLabel); + + GUILayout.Space(10); + GUILayout.Label("All Objects", EditorStyles.boldLabel); + + if(GUILayout.Button("Run on All")) + { + if(_objectsWithComponent != null) + TranslateAllObjects(); + else + Debug.Log("There are no objects with the component"); + } + + GUILayout.Space(10); + GUILayout.Label("Run Per Object", EditorStyles.boldLabel); + + if(_objectsWithComponent != null) + foreach(var obj in _objectsWithComponent) + if(GUILayout.Button(obj.name)) + { + TranslateSelectedObject(obj); + Debug.Log("Run on Selected Object was pressed"); + } + } + + [MenuItem("Tools/Object Translator UGUI")] + public static void ShowWindow() + { + GetWindow(typeof(ObjectTranslatorEditorWindow)); + } + + private List GetSortedObjectsWithComponent() where T : Component + { + // cr question: is FindObjectsByType the best option here? + var allObjects = FindObjectsByType(FindObjectsSortMode.None); + var objectsWithComponent = new List(); + + foreach(var obj in allObjects) + { + if(obj.GetComponent() != null) + objectsWithComponent.Add(obj); + } + + Debug.Log($"Found {objectsWithComponent.Count} objects with {typeof(T).Name}"); + + //Sort objects so "xx11" is after "xx2" + objectsWithComponent.Sort((a, b) => EditorUtility.NaturalCompare(a.name, b.name)); + + return objectsWithComponent; + } + + // Original function + /*private List FindObjectsWithComponent() + { + var allObjects = FindObjectsByType(FindObjectsSortMode.InstanceID); + var objectsWithComponent = new List(); + + foreach(var obj in allObjects) + if(obj.GetComponent() != null) + objectsWithComponent.Add(obj); + + Debug.Log($"Found {objectsWithComponent.Count} objects with ObjectTranslator"); + + return objectsWithComponent; + }*/ + + private void TranslateAllObjects() + { + foreach(var obj in _objectsWithComponent) + { + var translator = obj.GetComponent(); + + if(translator != null) + translator.TranslateObject(); + } + } + + private void TranslateSelectedObject(GameObject obj) + { + var translator = obj.GetComponent(); + + if(translator != null) + translator.TranslateObject(); + } + +} \ No newline at end of file From 7c44dffdbe03a00f4e80d6f1675bbb17d65bc2b9 Mon Sep 17 00:00:00 2001 From: mira-pichai Date: Tue, 27 May 2025 11:55:37 -0400 Subject: [PATCH 4/5] Add Object Translator custom Editor Window files (using UI Toolkit) --- ObjectTranslatorEditorWindowUITK.cs | 170 +++++++++++++++++++++++++++ ObjectTranslatorStylesheet.uss | 6 + ObjectTranslatorStylesheet.uss.meta | 11 ++ ObjectTranslatorVisualTree.uxml | 8 ++ ObjectTranslatorVisualTree.uxml.meta | 10 ++ 5 files changed, 205 insertions(+) create mode 100644 ObjectTranslatorEditorWindowUITK.cs create mode 100644 ObjectTranslatorStylesheet.uss create mode 100644 ObjectTranslatorStylesheet.uss.meta create mode 100644 ObjectTranslatorVisualTree.uxml create mode 100644 ObjectTranslatorVisualTree.uxml.meta diff --git a/ObjectTranslatorEditorWindowUITK.cs b/ObjectTranslatorEditorWindowUITK.cs new file mode 100644 index 0000000..d7f0b3a --- /dev/null +++ b/ObjectTranslatorEditorWindowUITK.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using UITKUtils; +using UnityEditor; +using UnityEngine; +using UnityEngine.Serialization; +using UnityEngine.UIElements; + +public class ObjectTranslatorEditorWindowUITK : EditorWindow +{ + private const string TranslateAllButtonName = "TranslateAll"; + private const string TranslateSelectionButtonName = "TranslateSelection"; + private const string TranslatableObjectsListViewName = "TranslatableObjectsListView"; + + private const string ErrorVisualTreeAssetMissing = "No VisualTreeAsset assigned in the Inspector"; + private const string ErrorCheckUXMLComponentNames = + "Null Reference Exception thrown. Make sure your UXML component labels are correct."; + + [SerializeField] private VisualTreeAsset m_treeVisualAsset; + + private List m_objectsWithComponent; + private ObjectTranslator m_objectTranslator; + + private VisualElement m_Root; + private ListView m_TranslatableObjectListView; + private Button m_TranslateAllButton; + private Button m_TranslateSelectionButton; + + private void OnEnable() + { + EditorApplication.hierarchyChanged += OnHierarchyChanged; + } + + private void OnDisable() + { + EditorApplication.hierarchyChanged -= OnHierarchyChanged; + } + + // chonky method. clean this up + public void CreateGUI() + { + m_Root = rootVisualElement; + + if(m_treeVisualAsset == null) + { + Debug.Log(ErrorVisualTreeAssetMissing); + return; + } + + m_treeVisualAsset.CloneTree(m_Root); + InitializeFields(); + InitializeObjectsWithComponent(); + MakeListView(); + BindButtonCallbacks(); + } + + [MenuItem("Tools/Object Translator UITK")] + public static void ShowWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Object Translator UITK"); + } + + private void InitializeFields() + { + m_TranslateAllButton = m_Root.Q