Skip to content

Commit 13b1f16

Browse files
authored
Create PreciseOffsetEditor.cs
1 parent 26927e8 commit 13b1f16

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// gameobject position fiddling tool (when dragging x,y,z axist in transform panel is too fast)
2+
3+
using UnityEngine;
4+
using UnityEditor;
5+
6+
namespace UnityLibrary.SceneTools
7+
{
8+
public class PreciseOffsetEditor : EditorWindow
9+
{
10+
private const string SpeedMultiplierKey = "UnityLibrary_PreciseOffset_SpeedMultiplier";
11+
12+
private GameObject selectedObject;
13+
private Vector3 offsetSliderValues = Vector3.zero;
14+
private float speedMultiplier = 0.01f;
15+
16+
private Vector3 originalPosition;
17+
private GameObject lastSelectedObject;
18+
19+
[MenuItem("Tools/UnityLibrary/Precise Model Offset")]
20+
public static void ShowWindow()
21+
{
22+
var win = GetWindow<PreciseOffsetEditor>("Precise Model Offset");
23+
win.minSize = new Vector2(300, 220);
24+
win.maxSize = new Vector2(300, 220);
25+
}
26+
27+
private void OnEnable()
28+
{
29+
speedMultiplier = EditorPrefs.GetFloat(SpeedMultiplierKey, 0.01f);
30+
}
31+
32+
private void OnDisable()
33+
{
34+
EditorPrefs.SetFloat(SpeedMultiplierKey, speedMultiplier);
35+
}
36+
37+
private void OnGUI()
38+
{
39+
EditorGUILayout.LabelField("Precise Model Offset", EditorStyles.boldLabel);
40+
EditorGUILayout.Space();
41+
42+
int selectedCount = Selection.gameObjects.Length;
43+
selectedObject = Selection.activeGameObject;
44+
45+
if (selectedCount == 0)
46+
{
47+
EditorGUILayout.HelpBox("No GameObject selected.", MessageType.Warning);
48+
return;
49+
}
50+
51+
if (selectedCount == 1)
52+
{
53+
EditorGUILayout.LabelField("Selected: " + selectedObject.name);
54+
}
55+
else
56+
{
57+
EditorGUILayout.LabelField("Selected: (multiple)");
58+
}
59+
60+
if (selectedObject != lastSelectedObject)
61+
{
62+
originalPosition = selectedObject.transform.position;
63+
offsetSliderValues = Vector3.zero;
64+
lastSelectedObject = selectedObject;
65+
}
66+
67+
EditorGUILayout.Space();
68+
EditorGUI.BeginChangeCheck();
69+
speedMultiplier = EditorGUILayout.Slider("Speed Multiplier", speedMultiplier, 0.001f, 1f);
70+
if (EditorGUI.EndChangeCheck())
71+
{
72+
EditorPrefs.SetFloat(SpeedMultiplierKey, speedMultiplier);
73+
}
74+
75+
EditorGUILayout.Space();
76+
EditorGUI.BeginChangeCheck();
77+
78+
// Store old values to detect changes
79+
Vector3 oldOffset = offsetSliderValues;
80+
81+
offsetSliderValues.x = EditorGUILayout.Slider("X Offset", offsetSliderValues.x, -100f, 100f);
82+
offsetSliderValues.y = EditorGUILayout.Slider("Y Offset", offsetSliderValues.y, -100f, 100f);
83+
offsetSliderValues.z = EditorGUILayout.Slider("Z Offset", offsetSliderValues.z, -100f, 100f);
84+
85+
Vector3 delta = offsetSliderValues - oldOffset;
86+
87+
if (delta != Vector3.zero)
88+
{
89+
Undo.RecordObject(selectedObject.transform, "Precise Offset");
90+
91+
Vector3 newPosition = selectedObject.transform.position;
92+
93+
if (!Mathf.Approximately(delta.x, 0f))
94+
newPosition.x = originalPosition.x + offsetSliderValues.x * speedMultiplier;
95+
96+
if (!Mathf.Approximately(delta.y, 0f))
97+
newPosition.y = originalPosition.y + offsetSliderValues.y * speedMultiplier;
98+
99+
if (!Mathf.Approximately(delta.z, 0f))
100+
newPosition.z = originalPosition.z + offsetSliderValues.z * speedMultiplier;
101+
102+
selectedObject.transform.position = newPosition;
103+
104+
EditorUtility.SetDirty(selectedObject);
105+
}
106+
107+
EditorGUILayout.Space();
108+
if (GUILayout.Button("Reset Offset"))
109+
{
110+
offsetSliderValues = Vector3.zero;
111+
if (selectedObject != null)
112+
{
113+
selectedObject.transform.position = originalPosition;
114+
}
115+
}
116+
}
117+
}
118+
}

0 commit comments

Comments
 (0)