Unity3d 圖片拖拽 Canvas Render Mode爲 ScreenSpace-Overlay

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;

public class PictureZoomForWindows : MonoBehaviour, IDragHandler, IPointerDownHandler
{
    #region Zoom
    /// <summary>
    /// 得到圖片
    /// </summary>
    public RectTransform image;
    /// <summary>
    /// 是否有兩隻手指按下
    /// </summary>
    private bool isTwoTouch = false;
    [SerializeField, Header("縮放")]
    float minExtend = 0.5f;
    [SerializeField, Header("擴大")]
    float maxExtend = 10.0f;
    #endregion

    #region Move

    // 當前面板  
    [SerializeField]
    private RectTransform panelRectTransform;
    // 父節點,這個最好是UI父節點,因爲它的矩形大小剛好是屏幕大小
    [SerializeField]
    private RectTransform parentRectTransform;
   

    #endregion

    [SerializeField]
    Image images;
    [SerializeField]
    bool isScrollWheel = false;
    [SerializeField]
    private float mouseExtendScale = 0.0f;
    [SerializeField, Header("鼠標縮放計算")]
    bool scrollScaleCal = false;
    [SerializeField, Range(1, 10)]
    int scaleFactor = 3;
    Vector3 offsetPos; //存儲按下鼠標時的圖片-鼠標位置差

    void Awake()
    {
        panelRectTransform = transform.parent as RectTransform;
        parentRectTransform = panelRectTransform.parent as RectTransform;
    }

    // Use this for initialization
    void Start()
    {
    }

    private void LateUpdate()
    {
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
        MouseExtend();
#endif
    }

    void MouseExtend()
    {

        if (isScrollWheel)
        {
            float scrollValue = Input.GetAxis("Mouse ScrollWheel");

            if (scrollValue < 0)
            {
                if (mouseExtendScale > 0)
                {
                    mouseExtendScale = 0;
                }
                mouseExtendScale += scrollValue * scaleFactor;
                scrollScaleCal = true;
#if UNITY_EDITOR
                Debug.Log("Zoom Out:\t" + mouseExtendScale);
#endif
            }
            //-Zoom In-//
            if (scrollValue > 0)
            {
                if (mouseExtendScale < 0)
                {
                    mouseExtendScale = 0;
                }

                mouseExtendScale += scrollValue * scaleFactor;
                scrollScaleCal = true;

#if UNITY_EDITOR
                Debug.Log("Zoom In:\t" + scrollValue);
#endif
            }

            PictureScale();
        }

    }

    /// <summary>
    /// 圖片縮放核心腳本 Windows 平臺放大縮小
    /// </summary>
    /// <param name="scaleDistance">縮放距離</param>
    private void PictureScale()
    {
        if (scrollScaleCal)
        {
            //當前圖片的縮放
            Vector3 curImageScale = new Vector3(image.localScale.x, image.localScale.y, 1);
            //兩根手指上一幀和這幀之間的距離差
            //因爲100個像素代表單位1,把距離差除以100看縮放幾倍
            float changeScaleDistance = mouseExtendScale / 100;

#if UNITY_EDITOR
            Debug.Log("ChangeScaleDistance:\t" + changeScaleDistance);
#endif

            //因爲縮放 Scale 是一個Vector3,所以這個代表縮放的Vector3的值就是縮放的倍數
            Vector3 changeScale = new Vector3(changeScaleDistance, changeScaleDistance, 0);
            //圖片的縮放等於當前的縮放加上 修改的縮放
            image.localScale = curImageScale + changeScale;
            //控制縮放級別
            image.localScale = new Vector3(Mathf.Clamp(image.localScale.x, minExtend, maxExtend), Mathf.Clamp(image.localScale.y, minExtend, maxExtend), 1);

            scrollScaleCal = false;

        }

    }
    /// <summary>
    /// 將鼠標的位置座標進行鉗制,然後加上位置差再賦值給圖片position
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        panelRectTransform.position = new Vector3(Mathf.Clamp(Input.mousePosition.x, 0, Screen.width), Mathf.Clamp(Input.mousePosition.y, 0, Screen.height), 0) + offsetPos;
    }
    /// <summary>
    /// 鼠摁下獲取偏差位置
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerDown(PointerEventData eventData)
    {
        offsetPos = panelRectTransform.position - Input.mousePosition;
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章