EDIT с учётом, что выяснилось, что игра в 3д-изометрии.
Есть некая точка, в которую всегда смотрит камера. И это та самая точка, вокруг которой должна вращаться камера, назовём её фокусом. Создай emptyObject на сцене и размести где-то чуть выше плоскости земли. Камеру размести на сцене так, как она должна изначально быть расположена относительно этой точки (главное, чтобы её x-координата была нулевой, важно в скрипте далее). С поворотом самой камеры в сцене париться сильно не надо, его мы назначим в
Start()
с помощью
LookAt()
.
Далее сделай камеру дочерней относительно фокуса, а в классе камеры заведи приватное поле под фокус и в инспекторе передай туда объект фокуса. А также заводим поля для настраиваемых скоростей.
[SerializeField] private Transform _focus;
[SerializeField] private float rotationSpeed = 1;
[SerializeField] private float moveSpeed = 1;
private void Start(){
//
tramsform.LookAt(_focus);
//
}
Таким образом, если есть фича мгновенного переноса фокуса камера на удалённые объекты, то нужно двигать только сам фокус на тот объект, а камера будет уже двигаться сама, так как дочерняя.
Далее поворот и движение якобы камеры, на самом деле фокуса, а камера меняет положение уже как дочерний объект
private void RotateCamera()
{
if (Input.GetMouseButton(1))
{
float mouseMove = Input.GetAxis("Mouse X") * rotationSpeed;
_focus.Rotate(0, mouseMove, 0); //-mouseMove для инвертирования
Debug.Log("Rotation " + mouseMove.ToString());
}
}
private void MoveCamera()
{
if (Input.GetMouseButton(0))
{
Vector3 mouseMove = new Vector3(Input.GetAxis("Mouse X"), 0, Input.GetAxis("Mouse Y")) * moveSpeed;
_focus.Translate(mouseMove, Space.Self); //-mouseMove для инвертирования
Debug.Log("Moving " + mouseMove.ToString());
}
}
Только сейчас понял, что то, что вы называли "центром камеры", и есть фокус, куда она смотрит.