237 lines
7.1 KiB
C#
237 lines
7.1 KiB
C#
using UnityEngine;
|
|
|
|
public class GhostStrategyTester : MonoBehaviour
|
|
{
|
|
[Header("Assign the scene object to edit")]
|
|
public GameObject TestTarget;
|
|
|
|
[Header("Move settings")]
|
|
public float ClampMin = -5f;
|
|
public float ClampMax = 5f;
|
|
|
|
[Header("Rotation settings")]
|
|
public float RotateSensitivity = 0.4f;
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
private enum Mode { None, AxisMove, AxisRotate }
|
|
private Mode _mode = Mode.None;
|
|
|
|
private AxisMoveStrategy _moveStrat;
|
|
private AxisRotateStrategy _rotStrat;
|
|
|
|
private bool _isEditing;
|
|
private bool _buttonHeld;
|
|
private int _activeAxisIndex = -1;
|
|
private float _lastMouseX;
|
|
private Vector3 _editingOrigin;
|
|
|
|
private static readonly Color[] AxisColors =
|
|
{
|
|
new Color(0.9f, 0.25f, 0.25f),
|
|
new Color(0.25f, 0.85f, 0.25f),
|
|
new Color(0.25f, 0.45f, 0.95f),
|
|
};
|
|
private static readonly string[] AxisLabels = { "X", "Y", "Z" };
|
|
|
|
private static readonly Vector3[] LocalMoveAxes =
|
|
{
|
|
Vector3.right,
|
|
Vector3.up,
|
|
Vector3.forward,
|
|
};
|
|
|
|
private static readonly AxisRotateStrategy.LocalAxis[] RotateAxes =
|
|
{
|
|
AxisRotateStrategy.LocalAxis.Right,
|
|
AxisRotateStrategy.LocalAxis.Up,
|
|
AxisRotateStrategy.LocalAxis.Forward,
|
|
};
|
|
|
|
private const float BtnW = 96f;
|
|
private const float BtnH = 36f;
|
|
private const float PadX = 12f;
|
|
private const float PadY = 8f;
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
private void Start()
|
|
{
|
|
GhostManagerV2.getInstance().onClearAddListener(() =>
|
|
{
|
|
_isEditing = false;
|
|
_buttonHeld = false;
|
|
_activeAxisIndex = -1;
|
|
_moveStrat = null;
|
|
_rotStrat = null;
|
|
});
|
|
}
|
|
|
|
// private void Update()
|
|
// {
|
|
// if (!_buttonHeld || _activeAxisIndex < 0) return;
|
|
|
|
// if (_mode == Mode.AxisRotate && _rotStrat != null)
|
|
// {
|
|
// float delta = Input.mousePosition.x - _lastMouseX;
|
|
// if (Mathf.Abs(delta) > 0.01f)
|
|
// _rotStrat.Rotate(delta * RotateSensitivity);
|
|
// }
|
|
|
|
// _lastMouseX = Input.mousePosition.x;
|
|
// }
|
|
|
|
// -------------------------------------------------------------------------
|
|
// GUI
|
|
// -------------------------------------------------------------------------
|
|
|
|
private void OnGUI()
|
|
{
|
|
if (TestTarget == null)
|
|
{
|
|
GUI.Label(new Rect(PadX, PadX, 300, 24), "Assign TestTarget in the Inspector.");
|
|
return;
|
|
}
|
|
|
|
float y = PadX;
|
|
|
|
// ── Mode buttons ───────────────────────────────────────────────
|
|
DrawModeButton("Move", Mode.AxisMove, new Rect(PadX, y, BtnW, BtnH));
|
|
DrawModeButton("Rotate", Mode.AxisRotate, new Rect(PadX + BtnW + PadY, y, BtnW, BtnH));
|
|
y += BtnH + PadY;
|
|
|
|
if (_mode == Mode.None)
|
|
{
|
|
GUI.Label(new Rect(PadX, y, 300, 24), "Select a mode above.");
|
|
return;
|
|
}
|
|
|
|
// ── Axis buttons ───────────────────────────────────────────────
|
|
string hint = _mode == Mode.AxisMove
|
|
? "Hold to drag along axis:"
|
|
: "Hold and drag left/right to rotate:";
|
|
GUI.Label(new Rect(PadX, y, 350, 20), hint);
|
|
y += 22f;
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
Rect btnRect = new Rect(PadX + i * (BtnW + PadY), y, BtnW, BtnH);
|
|
DrawAxisButton(i, btnRect);
|
|
}
|
|
|
|
y += BtnH + PadY * 2;
|
|
|
|
// ── Commit / Cancel ────────────────────────────────────────────
|
|
if (GUI.Button(new Rect(PadX, y, BtnW, BtnH), "Commit"))
|
|
CommitEdit();
|
|
|
|
if (GUI.Button(new Rect(PadX + BtnW + PadY, y, BtnW, BtnH), "Cancel"))
|
|
StopEditing();
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
private void DrawAxisButton(int i, Rect rect)
|
|
{
|
|
bool held = _buttonHeld && _activeAxisIndex == i;
|
|
|
|
GUI.backgroundColor = held ? AxisColors[i] : AxisColors[i] * 0.55f;
|
|
GUI.contentColor = Color.white;
|
|
|
|
bool pressed = GUI.RepeatButton(rect, $"{AxisLabels[i]} axis");
|
|
|
|
if (pressed && (!_buttonHeld || _activeAxisIndex != i))
|
|
OnAxisButtonDown(i);
|
|
|
|
if (!pressed && _buttonHeld && _activeAxisIndex == i)
|
|
OnAxisButtonUp();
|
|
|
|
GUI.backgroundColor = Color.white;
|
|
GUI.contentColor = Color.white;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
private void OnAxisButtonDown(int axisIndex)
|
|
{
|
|
EnsureEditing();
|
|
|
|
_activeAxisIndex = axisIndex;
|
|
_buttonHeld = true;
|
|
_lastMouseX = Input.mousePosition.x;
|
|
|
|
if (_mode == Mode.AxisMove)
|
|
{
|
|
Transform ghost = GhostManagerV2.getInstance().GhostTransform;
|
|
Vector3 worldAxis = ghost.TransformDirection(LocalMoveAxes[axisIndex]);
|
|
|
|
_moveStrat = new AxisMoveStrategy(ghost.rotation, ClampMin, ClampMax);
|
|
_moveStrat.BeginDrag(worldAxis, ghost.position);
|
|
GhostManagerV2.getInstance().SetMovementStrategy(_moveStrat);
|
|
}
|
|
else
|
|
{
|
|
_rotStrat = new AxisRotateStrategy(
|
|
RotateAxes[axisIndex],
|
|
GhostManagerV2.getInstance().GhostTransform.position);
|
|
GhostManagerV2.getInstance().SetMovementStrategy(_rotStrat);
|
|
}
|
|
}
|
|
|
|
private void OnAxisButtonUp()
|
|
{
|
|
_buttonHeld = false;
|
|
_activeAxisIndex = -1;
|
|
|
|
if (_mode == Mode.AxisMove)
|
|
_moveStrat?.EndDrag();
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
private void EnsureEditing()
|
|
{
|
|
if (_isEditing) return;
|
|
_editingOrigin = TestTarget.transform.position;
|
|
GhostManagerV2.getInstance().SetupExistingBlock(TestTarget, new FreeMoveStrategy());
|
|
_isEditing = true;
|
|
}
|
|
|
|
private void CommitEdit()
|
|
{
|
|
GhostManagerV2.getInstance().ForceCommit();
|
|
ResetState();
|
|
}
|
|
|
|
private void StopEditing()
|
|
{
|
|
GhostManagerV2.getInstance().ClearGhostData();
|
|
ResetState();
|
|
}
|
|
|
|
private void ResetState()
|
|
{
|
|
_mode = Mode.None;
|
|
_activeAxisIndex = -1;
|
|
_buttonHeld = false;
|
|
_isEditing = false;
|
|
_moveStrat = null;
|
|
_rotStrat = null;
|
|
}
|
|
|
|
private void DrawModeButton(string label, Mode target, Rect rect)
|
|
{
|
|
bool active = _mode == target;
|
|
GUI.backgroundColor = active ? Color.white : new Color(0.55f, 0.55f, 0.55f);
|
|
GUI.contentColor = active ? Color.black : Color.white;
|
|
|
|
if (GUI.Button(rect, label) && !active)
|
|
{
|
|
StopEditing();
|
|
_mode = target;
|
|
}
|
|
|
|
GUI.backgroundColor = Color.white;
|
|
GUI.contentColor = Color.white;
|
|
}
|
|
} |