Забудь про края экрана. Хочешь управлять камерой как в дорогих тактиках?
Зажимаешь правую кнопку — тащишь карту, крутишь колёсико — приближаешь/отдаляешь.
Код ниже — готовый компонент с подробными комментариями. Вешай на камеру и настраивай под себя.
using UnityEngine;
public class CameraDragZoom : MonoBehaviour
{
[Header("Перетаскивание")]
[Tooltip("Скорость движения камеры за мышкой")]
[SerializeField] private float dragSpeed = 1f;
private Vector3 dragOrigin; // точка в мире, где была мышь в момент начала перетаскивания
[Header("Зум")]
[Tooltip("Чувствительность колёсика мыши")]
[SerializeField] private float zoomSpeed = 5f;
[Tooltip("Минимальный размер камеры (сильное приближение)")]
[SerializeField] private float minSize = 3f;
[Tooltip("Максимальный размер камеры (сильное отдаление)")]
[SerializeField] private float maxSize = 10f;
private Camera cam;
private void Start()
{
// Получаем компонент камеры на этом же объекте
cam = GetComponent<Camera>();
// Если камера не ортографическая (например, 3D), можно переключить режим в инспекторе
// Для 2D стратегии камера обычно ортографическая
}
private void Update()
{
// --- Перетаскивание (правая кнопка мыши) ---
// При зажатии ПКМ запоминаем позицию мыши в мировых координатах
if (Input.GetMouseButtonDown(1))
{
// ScreenToWorldPoint переводит экранные пиксели в координаты мира
dragOrigin = cam.ScreenToWorldPoint(Input.mousePosition);
}
// Пока кнопка зажата — двигаем камеру
if (Input.GetMouseButton(1))
{
// Разница между запомненной точкой и текущим положением мыши в мире
Vector3 difference = dragOrigin - cam.ScreenToWorldPoint(Input.mousePosition);
// Перемещаем камеру на эту разницу (игнорируем Z, т.к. камера смотрит сверху)
transform.position += difference;
}
// --- Зум колёсиком мыши ---
// Input.GetAxis("Mouse ScrollWheel") даёт значение:
// > 0 если крутим вверх (приближение)
// < 0 если крутим вниз (отдаление)
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (scroll != 0f)
{
// Для 2D камеры меняем orthographicSize
cam.orthographicSize -= scroll * zoomSpeed;
// Ограничиваем размер, чтобы камера не улетела слишком близко или далеко
cam.orthographicSize = Mathf.Clamp(cam.orthographicSize, minSize, maxSize);
}
}
}
✅ Что важно знать
- Ортографическая камера — используй для 2D, тайлов, стратегий. В инспекторе поставь
Projection: Orthographic. - Скорости (
dragSpeed, zoomSpeed) сейчас используются по-разному: для перетаскивания скорость жёстко не регулируется (движение 1:1). Если хочешь замедлить перетаскивание — умножай difference на dragSpeed * Time.deltaTime. Но обычно 1:1 удобнее. - Ограничения:
minSize и maxSize подбирай под размер своей карты. Чтобы камера не выходила за края, можно добавить проверку границ (это уже другая тема).📌 Сохрани пост — пригодится в любом проекте с картой.
🔔 Подпишись — дальше будет про инерцию, ограничение краёв карты и сглаживание движения.
👉 Akrus Games | Unity
💬 А ты камеру двигаешь или оставляешь статичной? Пиши в комментах.