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 }
0 comments:
Post a Comment