Saturday, October 1, 2016

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

Leave a Comment

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;   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);    }   void Update() {     // Get the left mouse button     if (Input.GetMouseButtonDown(0))     {         // Get mouse origin         mouseOrigin = Input.mousePosition;         isPanning = true;     }       // Disable movements on button release     if (!Input.GetMouseButton(0)) isPanning = false;      // Rotate camera along X and Y axis      // Move the camera on it's XY plane     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();     }  }  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.

2 Answers

Answers 1

You can do this using Unity UI - Scroll Rect.

Check out Unity UI - Scroll Rect - Introduction

Answers 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 } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment