fix: исправил баг перемапинга кнопок и смещения домашней позиции камеры
This commit is contained in:
parent
e370055c07
commit
cd3decc96b
@ -24,7 +24,8 @@ public class CameraPivotController : MonoBehaviour
|
||||
|
||||
private Quaternion _homeRotation;
|
||||
|
||||
TargetCursor targetCursor;
|
||||
private TargetCursor targetCursor;
|
||||
public TargetCursor TargetCursor => targetCursor;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
|
||||
@ -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<CameraPivotController>();
|
||||
if (camCtrl != null)
|
||||
{
|
||||
camCtrl.CaptureHomeNow();
|
||||
camCtrl.TargetCursor?.SwitchButton(cameraPivot.rotation.eulerAngles);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -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();
|
||||
|
||||
// --- Âûñòðåë / óñòàíîâêà ---
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user