Files
JuegoSim/Assets/_Project/Scripts/Code/InteractionLayer/Managers/GhostExtensions/GhostStrategyTester.cs
T
2026-07-21 08:56:10 +03:00

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;
}
}