'How do I make the border of a map and the panning of that map the same?

I am using a map bigger than the screen I viewing. Therefore I need to be able to pan around that map. I am having a problem with clamping the camera and the map. I want to be able to use the demension of the image as the width and height of the clamp. The problem is the units.

The image is 2144 x 1708 The camera transposition is in single digits (14 x 7) or something like that.

All of the code I am using is below.

private Vector3 mouseOrigin;    // Position of cursor when mouse dragging starts
private bool isPanning;         // Is the camera being panned?

public bool useBoundary = true;
public Vector2 boundaryMin;
public Vector2 boundaryMax;
public Image map;

private void Start()
{
    Camera cam     = Camera.main;
    float mapRatio = map.rectTransform.rect.width / map.rectTransform.rect.height;

    float mapScreenHeight = (1.5f * cam.orthographicSize);
    float mapScreenWidth  = (3f * mapScreenHeight) * cam.aspect;

    boundaryMin = new Vector2(0, 1);
    boundaryMax = new Vector2(map.rectTransform.rect.width, map.rectTransform.rect.height);
}
private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        mouseOrigin = Input.mousePosition;
        isPanning   = true;
    }
    // Disable movements on button release
    if (!Input.GetMouseButton(0)) 
        isPanning = false;
    if (isPanning)
    {
        Vector3 pos  = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
        Vector3 move = new Vector3(pos.x * panSpeed, pos.y * panSpeed, 0);
        transform.Translate(move, Space.Self);
        BoundaryCheck();
    }
}
private void BoundaryCheck()
{
    if (!useBoundary)
        return;
    Vector3 newPos = transform.position;

    newPos.x = Mathf.Clamp(newPos.x, boundaryMin.x, boundaryMax.x);
    newPos.y = Mathf.Clamp(newPos.y, boundaryMin.y, boundaryMax.y);
    transform.position = newPos;
}

}

Any help would be greatly appreciated.



Solution 1:[1]

You can do this using Unity UI - Scroll Rect.

Check out Unity UI - Scroll Rect - Introduction

Solution 2:[2]

In my opinion you should need to use below script for camera panning, zooming and rotating. You can off any undesirable function. Now according to your question you have to restrict the movement(according to your image border). simply you can restrict the camera movements on differet axis according to your limitations. You should place cubes into the borders of the map and use their positions as the limit of camera movement and panning etc.

using UnityEngine;
using System.Collections;

public class CamMovementManager : MonoBehaviour
{
    #region Vars
    public float turnSpeed = 1.0f;      // Speed of camera turning when mouse moves in along an axis
    public float panSpeed = 4.0f;       // Speed of the camera when being panned
    public float zoomSpeed = 4.0f;      // Speed of the camera going back and forth

    private Vector3 mouseOrigin;    // Position of cursor when mouse dragging starts
    private bool isPanning;     // Is the camera being panned?
    private bool isRotating;    // Is the camera being rotated?
    private bool isZooming;     // Is the camera zooming?

    private float pannPosLimit = 300f;
    private int fovMin = 15;
    private int fovMax = 90;

    #endregion Vars

    #region UnityEvents

    void Update()
    {
        // Get the left mouse button
        if (Input.GetMouseButtonDown(0))
        {
            // Get mouse origin
            mouseOrigin = Input.mousePosition;
            isRotating = true;
        }

        // Get the right mouse button
        if (Input.GetMouseButtonDown(1))
        {
            // Get mouse origin
            mouseOrigin = Input.mousePosition;
            isPanning = true;
        }

        // Get the middle mouse button
        if (Input.GetMouseButtonDown(2))
        {
            // Get mouse origin
            //mouseOrigin = Input.mousePosition;
            //isZooming = true;
        }

        //changing fov on mouse scroll to zoomIn/out
        float fov = Camera.main.fieldOfView;
        fov += Input.GetAxis("Mouse ScrollWheel") * 10f;
        fov = Mathf.Clamp(fov, fovMin, fovMax);
        Camera.main.fieldOfView = fov;//*/


        // Disable movements on button release
        if (!Input.GetMouseButton(0)) isRotating = false;
        if (!Input.GetMouseButton(1)) isPanning = false;
        if (!Input.GetMouseButton(2)) isZooming = false;

        // Rotate camera along X and Y axis
        if (isRotating)
        {
            Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
            //Debug.Log("rotate pos : " + pos);
            transform.RotateAround(transform.position, transform.right, -pos.y * turnSpeed);
            transform.RotateAround(transform.position, Vector3.up, pos.x * turnSpeed);

        }

        // Move the camera on it's XY plane
        if (isPanning)
        {
            if (Input.mousePosition.y > pannPosLimit)
            {
                Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);

                Vector3 move = new Vector3(pos.x * panSpeed, pos.y * panSpeed, 0);
                transform.Translate(move, Space.Self);
            }
        }

        // Move the camera linearly along Z axis
        if (isZooming)
        {
            Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);

            Vector3 move = pos.y * zoomSpeed * transform.forward;
            transform.Translate(move, Space.World);
        }
    }

    #endregion

    #region CustomMethods

    public void CamRotating()
    {

        Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);

        transform.RotateAround(transform.position, transform.right, -pos.y * turnSpeed);
        transform.RotateAround(transform.position, Vector3.up, pos.x * turnSpeed);
    }

    public void CamPanning()
    {
        Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);

        Vector3 move = new Vector3(pos.x * panSpeed, pos.y * panSpeed, 0);
        transform.Translate(move, Space.Self);
    }

    public void CamZooming()
    {
        Vector3 pos = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);

        Vector3 move = pos.y * zoomSpeed * transform.forward;
        transform.Translate(move, Space.World);
    }

    #endregion CustomMethods
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Anmol Mahatpurkar
Solution 2 Muhammad Faizan Khan