2016-09-21 7 views
6

Görüntülediğim ekrandan daha büyük bir harita kullanıyorum. Bu yüzden o haritanın etrafında gezinebilmem gerekiyor. Fotoğraf makinesini ve haritayı sıkıştırırken sorun yaşıyorum. Görüntünün gerilemesini kelepçenin genişliği ve yüksekliği olarak kullanabilmek istiyorum. Sorun birimlerdir.Bir haritanın kenarlığını ve o haritanın panosunu aynı şekilde nasıl yapabilirim?

Resim 2144 x 1708 Fotoğraf makinesi aktarımı tek hanedir (14 x 7) veya böyle bir şeydir.

Kullandığım tüm kodlar aşağıda.

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; 
} 

}

bir Yardım büyük takdir.

+0

14x7 boyutunda başka bir resim kullanamaz mısınız? Ve sen editörde “boundaryMin” ve “boundaryMax” 'ı açığa çıkarıyorsun ama sonra 'Start()' da onların değerinin üzerine yazıyorsun, böylece onları kamuya açmanın ne anlamı var? –

+0

Bir şeyleri özel olarak değiştirebilirim, bu bir sorun değil. Bir kaydırma haritasında, normal olarak haritanın boyutlarını ekrana göre ayarlar mısınız? Bu ekran bir mobil cihazda değiştiğinde nasıl çalışır? –

cevap

2

Bunu, Unity UI - Scroll Rect kullanarak yapabilirsiniz.

Eğer yakınlaştırma ve dönen kamera kaydırma için komut aşağıdan seçin gerektiğinde dışarı Unity UI - Scroll Rect - Introduction

+0

Bu işe yarayabilir gibi görünüyor! Bırak onu vereyim. –

+0

Elbette. Cevabı faydalı bulursanız, bunu yapın. –

1

Bence kontrol edin. İstenmeyen bir işlevi kapatabilirsiniz. Şimdi sorunuza göre hareketi kısıtlamak zorundasınız (görüntü sınırınıza göre). sınırlamalarınıza göre kamera hareketlerini farklı eksende kısıtlayabilirsiniz. Küpleri haritanın kenarlarına yerleştirmeli ve konumlarını kamera hareketi ve kaydırma sınırı olarak kullanmalısınız.

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

Aslında gönderdiklerine benzer bir kodla başladım. Kutu yöntemini deneyeceğim ve ekran boyutuyla iyi ölçeklenip ölçeklenmediğini göreceğim. –

+0

kutuları, görüntü kenarlığı hakkında anlatıldığı gibi, kamera hareketleriniz için sınırlamalardır –

+0

kutu pozisyonu sadece kullanım içindir, böylece kutu kafesleri kapalı olabilir –