diff --git a/Assets/Scripts/CameraPivotController.cs b/Assets/Scripts/CameraPivotController.cs index 28a6c587..bc0fa599 100644 --- a/Assets/Scripts/CameraPivotController.cs +++ b/Assets/Scripts/CameraPivotController.cs @@ -24,7 +24,8 @@ public class CameraPivotController : MonoBehaviour private Quaternion _homeRotation; - TargetCursor targetCursor; + private TargetCursor targetCursor; + public TargetCursor TargetCursor => targetCursor; void Awake() { diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index bca33983..69050b9f 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -785,6 +785,10 @@ private IEnumerator MoveCameraSmoothly(Transform target) { Transform cam = playerCamera.transform; + // ОтÑ�оединÑ�ем камеру от пивота на времÑ� перемещениÑ� — + // иначе поворот пивота кнопками во времÑ� полёта камеры Ñ�двигает её конечную позицию + cam.SetParent(null); + Vector3 startPos = cam.position; Quaternion startRot = cam.rotation; @@ -796,16 +800,30 @@ private IEnumerator MoveCameraSmoothly(Transform target) while (elapsed < cameraMoveDuration) { float t = elapsed / cameraMoveDuration; - cam.position = Vector3.Lerp(startPos, endPos, t); cam.rotation = Quaternion.Slerp(startRot, endRot, t); - elapsed += Time.deltaTime; yield return null; } cam.position = endPos; cam.rotation = endRot; + + // СбраÑ�ываем пивот и возвращаем камеру обратно как дочерний объект + if (cameraPivot != null) + { + cameraPivot.rotation = Quaternion.identity; + // worldPositionStays: true — локальные координаты переÑ�читаютÑ�Ñ� под новый пивот + cam.SetParent(cameraPivot, true); + + // ФикÑ�ируем новый "дом" и Ñ�инхронизируем квадрант курÑ�ора + var camCtrl = cameraPivot.GetComponent(); + if (camCtrl != null) + { + camCtrl.CaptureHomeNow(); + camCtrl.TargetCursor?.SwitchButton(cameraPivot.rotation.eulerAngles); + } + } } /// diff --git a/Assets/Scripts/TargetCursor.cs b/Assets/Scripts/TargetCursor.cs index c252f9a4..b4fa1603 100644 --- a/Assets/Scripts/TargetCursor.cs +++ b/Assets/Scripts/TargetCursor.cs @@ -40,12 +40,40 @@ public class TargetCursor : MonoBehaviour private PlayerKeySet activeKeys; + // Òåêóùèé êâàäðàíò êàìåðû: 0=âïåð¸ä, 1=âïðàâî, 2=íàçàä, 3=âëåâî + private int cameraQuadrant = 0; - // êíîïî÷êè - private ButtonPinMapping upKey; - private ButtonPinMapping downKey; - private ButtonPinMapping leftKey; - private ButtonPinMapping rightKey; + // Âîçâðàùàåò ôèçè÷åñêóþ êíîïêó êîòîðóþ íóæíî íàæàòü ÷òîáû ñäâèíóòü êóðñîð â íóæíîì íàïðàâëåíèè + // dx,dy — ëîãè÷åñêîå íàïðàâëåíèå äâèæåíèÿ êóðñîðà íà ïîëå + private ButtonPinMapping GetKeyForDirection(int dx, int dy) + { + // Ïîâîðîò êàìåðû íà 90° âïðàâî: ôèçè÷åñêàÿ îñü ïîâîðà÷èâàåòñÿ + // q=0: âïåð¸ä=ââåðõ, âïðàâî=âïðàâî, íàçàä=âíèç, âëåâî=âëåâî + // q=1: âïåð¸ä=âïðàâî, âïðàâî=âíèç, íàçàä=âëåâî, âëåâî=ââåðõ + // q=2: âïåð¸ä=âíèç, âïðàâî=âëåâî, íàçàä=ââåðõ, âëåâî=âïðàâî + // q=3: âïåð¸ä=âëåâî, âïðàâî=ââåðõ, íàçàä=âïðàâî, âëåâî=âíèç + + int rotDx = dx; + int rotDy = dy; + + for (int i = 0; i < cameraQuadrant; i++) + { + // Ïîâîðîò âåêòîðà íà -90° (êàìåðà ïîâåðíóëàñü âïðàâî — âåêòîð ïîâîðà÷èâàåì âëåâî) + int tmp = rotDx; + rotDx = rotDy; + rotDy = -tmp; + } + + // Òåïåðü rotDx/rotDy — ýòî êàêóþ ôèçè÷åñêóþ êíîïêó íàæàòü + if (rotDx == 0 && rotDy == -1) return activeKeys.Up; + if (rotDx == 0 && rotDy == 1) return activeKeys.Down; + if (rotDx == 1 && rotDy == 0) return activeKeys.Right; + if (rotDx == -1 && rotDy == 0) return activeKeys.Left; + + return activeKeys.Up; // fallback + } + + // êíîïî÷êè (òîëüêî fire è ïîâîðîò êîðàáëÿ — îíè íå çàâèñÿò îò êàìåðû) private ButtonPinMapping fireKey; private ButtonPinMapping turnLeftKey; private ButtonPinMapping turnRightKey; @@ -72,7 +100,8 @@ public void Initialize(GameManager gm, int playerId = 1, bool isPlacingShips = f if (cameraPivot == null) { cameraPivot = gameManager.cameraPivot; - gameManager.playerCamera.transform.SetParent(cameraPivot); + // SetParent ÍÅ äåëàåì çäåñü — ýòèì óïðàâëÿåò MoveCameraSmoothly + // ÷òîáû íå êîíôëèêòîâàòü ñ êîðóòèíîé ïåðåìåùåíèÿ êàìåðû } // âñåãäà íàñòðàèâàåì êîíòðîëëåð @@ -101,55 +130,26 @@ private void BindKeys(int playerId) { activeKeys = (playerId == 1) ? player1Keys : player2Keys; - upKey = activeKeys.Up; - downKey = activeKeys.Down; - leftKey = activeKeys.Left; - rightKey = activeKeys.Right; - fireKey = activeKeys.Fire; - turnLeftKey = activeKeys.TurnLeft; + // Íàïðàâëåíèÿ (up/down/left/right) íå êîïèðóåì — îíè âû÷èñëÿþòñÿ ÷åðåç MapKey + cameraQuadrant + fireKey = activeKeys.Fire; + turnLeftKey = activeKeys.TurnLeft; turnRightKey = activeKeys.TurnRight; } public void SwitchButton(Vector3 rotate) { + if (activeKeys == null) return; // çàùèòà îò âûçîâà äî Initialize + float y = rotate.y; if (y > 180) y -= 360; Debug.Log($"Y rotation = {y}"); - // Âïåð¸ä - if (y >= -45 && y < 45) - { - upKey = activeKeys.Up; - leftKey = activeKeys.Left; - downKey = activeKeys.Down; - rightKey = activeKeys.Right; - } - // Âëåâî - else if (y >= -135 && y < -45) - { - upKey = activeKeys.Right; - leftKey = activeKeys.Up; - downKey = activeKeys.Left; - rightKey = activeKeys.Down; - } - // Âïðàâî - else if (y >= 45 && y < 135) - { - upKey = activeKeys.Left; - leftKey = activeKeys.Down; - downKey = activeKeys.Right; - rightKey = activeKeys.Up; - } - // Íàçàä (180°) - else - { - upKey = activeKeys.Down; - leftKey = activeKeys.Right; - downKey = activeKeys.Up; - rightKey = activeKeys.Left; - } + if (y >= -45 && y < 45) cameraQuadrant = 0; // âïåð¸ä + else if (y >= 45 && y < 135) cameraQuadrant = 1; // âïðàâî + else if (y >= 135 || y < -135) cameraQuadrant = 2; // íàçàä + else cameraQuadrant = 3; // âëåâî } void Update() @@ -182,10 +182,10 @@ void Update() // --- Äâèæåíèå êóðñîðà --- bool moved = false; - if (In.GetButtonDown(upKey)) { MoveCursor(0, -1); moved = true; } - if (In.GetButtonDown(downKey)) { MoveCursor(0, 1); moved = true; } - if (In.GetButtonDown(rightKey)) { MoveCursor(1, 0); moved = true; } - if (In.GetButtonDown(leftKey)) { MoveCursor(-1, 0); moved = true; } + if (In.GetButtonDown(GetKeyForDirection( 0, -1))) { MoveCursor( 0, -1); moved = true; } + if (In.GetButtonDown(GetKeyForDirection( 0, 1))) { MoveCursor( 0, 1); moved = true; } + if (In.GetButtonDown(GetKeyForDirection( 1, 0))) { MoveCursor( 1, 0); moved = true; } + if (In.GetButtonDown(GetKeyForDirection(-1, 0))) { MoveCursor(-1, 0); moved = true; } if (moved) UpdateCursorPosition(); // --- Âûñòðåë / óñòàíîâêà ---