返回

製作地圖拖拽, 放大和邊界限制

前言


本篇會使用Unity實現地圖拖拽放大的功能

需要實現以下的需求:

  1. 滑鼠滾輪可以放大縮小地圖

  2. 放大縮小時根據滑鼠的位置進行縮放

  3. 點擊滑鼠中鍵可以拖動地圖

  4. 拖動地圖的時候不可以超出地圖邊界

  5. 可以設定變量進行無限制邊界拖動


Demo 影片

先看看最終的效果:

0:00/0:231×


在編輯器下的效果:

0:00/0:291×


Youtube 影片

數學原理

核心的原理如上圖

會有3個主要的物件:

  1. World Space Canvas 下的大地圖

  2. Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界

  3. Camera 的 Viewport

然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport

所以變成這個樣子:

Camera 設定成 Orthographic

接著控制 Camera 的位移和 Size

就可以進行縮放和拖動

(如果是 Perspective 的話就是控制 z 的位置進行縮放)

所以 Inspector 架構會長這個樣子:

有兩個 Canvas

一個是 Overlay Space - 下面有一個觀察視窗的Image

另一個是 World Space - 下面是大地圖

代碼


核心的代碼有四個部分:

  1. MappingUIParameter - 一開始的時候計算邊界數值

  2. Zoom - 處理放大的功能

  3. Drag - 處理拖拽

  4. SnapBoundary - 處理超出邊界的問題

c#


1 - MappingUIParameter

c#

這個代碼主要是用來轉換和計算地圖和觀察視窗在熒幕下的坐標

轉換坐標的代碼:

c#


2 - Zoom

c#

接下來這個是處理 Camera 放大縮小的代碼

核心就是調整 Camera 的 orthographicSize

然後再根據滑鼠的位置來調整 Camera 的位置

實現指哪縮放哪的效果


3 - Drag

c#

這個也比較簡單

當滑鼠中鍵點擊的時候進行位置的記錄

然後根據位移量來移動 Camera 的位置


4 - SnapBoundary

c#

為了不要超出視窗觀察邊界

可以在最後加上這個代碼

讓拖拽的時候容易不會超出去邊界

如果把這個代碼拿掉,就可以實現無邊界拖拽

第一行通過 GetScreenRectOfWorldUI

將地圖在世界上的坐標位置和大小轉換成螢幕空間

然後計算 dx 和 dy (x軸和y軸的偏移量是多少)

再把 Camera 超出的位置位移回去

完整代碼

c#


範例 Unity Package

mapCtlmapCtl.unitypackage5 MB

參考資料

前言


本篇會使用Unity實現地圖拖拽放大的功能

需要實現以下的需求:

  1. 滑鼠滾輪可以放大縮小地圖

  2. 放大縮小時根據滑鼠的位置進行縮放

  3. 點擊滑鼠中鍵可以拖動地圖

  4. 拖動地圖的時候不可以超出地圖邊界

  5. 可以設定變量進行無限制邊界拖動


Demo 影片

先看看最終的效果:

0:00/0:231×


在編輯器下的效果:

0:00/0:291×


Youtube 影片

數學原理

核心的原理如上圖

會有3個主要的物件:

  1. World Space Canvas 下的大地圖

  2. Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界

  3. Camera 的 Viewport

然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport

所以變成這個樣子:

Camera 設定成 Orthographic

接著控制 Camera 的位移和 Size

就可以進行縮放和拖動

(如果是 Perspective 的話就是控制 z 的位置進行縮放)

所以 Inspector 架構會長這個樣子:

有兩個 Canvas

一個是 Overlay Space - 下面有一個觀察視窗的Image

另一個是 World Space - 下面是大地圖

代碼


核心的代碼有四個部分:

  1. MappingUIParameter - 一開始的時候計算邊界數值

  2. Zoom - 處理放大的功能

  3. Drag - 處理拖拽

  4. SnapBoundary - 處理超出邊界的問題

c#


1 - MappingUIParameter

c#

這個代碼主要是用來轉換和計算地圖和觀察視窗在熒幕下的坐標

轉換坐標的代碼:

c#


2 - Zoom

c#

接下來這個是處理 Camera 放大縮小的代碼

核心就是調整 Camera 的 orthographicSize

然後再根據滑鼠的位置來調整 Camera 的位置

實現指哪縮放哪的效果


3 - Drag

c#

這個也比較簡單

當滑鼠中鍵點擊的時候進行位置的記錄

然後根據位移量來移動 Camera 的位置


4 - SnapBoundary

c#

為了不要超出視窗觀察邊界

可以在最後加上這個代碼

讓拖拽的時候容易不會超出去邊界

如果把這個代碼拿掉,就可以實現無邊界拖拽

第一行通過 GetScreenRectOfWorldUI

將地圖在世界上的坐標位置和大小轉換成螢幕空間

然後計算 dx 和 dy (x軸和y軸的偏移量是多少)

再把 Camera 超出的位置位移回去

完整代碼

c#


範例 Unity Package

mapCtlmapCtl.unitypackage5 MB

參考資料

前言


本篇會使用Unity實現地圖拖拽放大的功能

需要實現以下的需求:

  1. 滑鼠滾輪可以放大縮小地圖

  2. 放大縮小時根據滑鼠的位置進行縮放

  3. 點擊滑鼠中鍵可以拖動地圖

  4. 拖動地圖的時候不可以超出地圖邊界

  5. 可以設定變量進行無限制邊界拖動


Demo 影片

先看看最終的效果:

0:00/0:231×


在編輯器下的效果:

0:00/0:291×


Youtube 影片

數學原理

核心的原理如上圖

會有3個主要的物件:

  1. World Space Canvas 下的大地圖

  2. Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界

  3. Camera 的 Viewport

然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport

所以變成這個樣子:

Camera 設定成 Orthographic

接著控制 Camera 的位移和 Size

就可以進行縮放和拖動

(如果是 Perspective 的話就是控制 z 的位置進行縮放)

所以 Inspector 架構會長這個樣子:

有兩個 Canvas

一個是 Overlay Space - 下面有一個觀察視窗的Image

另一個是 World Space - 下面是大地圖

代碼


核心的代碼有四個部分:

  1. MappingUIParameter - 一開始的時候計算邊界數值

  2. Zoom - 處理放大的功能

  3. Drag - 處理拖拽

  4. SnapBoundary - 處理超出邊界的問題

c#


1 - MappingUIParameter

c#

這個代碼主要是用來轉換和計算地圖和觀察視窗在熒幕下的坐標

轉換坐標的代碼:

c#


2 - Zoom

c#

接下來這個是處理 Camera 放大縮小的代碼

核心就是調整 Camera 的 orthographicSize

然後再根據滑鼠的位置來調整 Camera 的位置

實現指哪縮放哪的效果


3 - Drag

c#

這個也比較簡單

當滑鼠中鍵點擊的時候進行位置的記錄

然後根據位移量來移動 Camera 的位置


4 - SnapBoundary

c#

為了不要超出視窗觀察邊界

可以在最後加上這個代碼

讓拖拽的時候容易不會超出去邊界

如果把這個代碼拿掉,就可以實現無邊界拖拽

第一行通過 GetScreenRectOfWorldUI

將地圖在世界上的坐標位置和大小轉換成螢幕空間

然後計算 dx 和 dy (x軸和y軸的偏移量是多少)

再把 Camera 超出的位置位移回去

完整代碼

c#


範例 Unity Package

mapCtlmapCtl.unitypackage5 MB

參考資料

前言


本篇會使用Unity實現地圖拖拽放大的功能

需要實現以下的需求:

  1. 滑鼠滾輪可以放大縮小地圖

  2. 放大縮小時根據滑鼠的位置進行縮放

  3. 點擊滑鼠中鍵可以拖動地圖

  4. 拖動地圖的時候不可以超出地圖邊界

  5. 可以設定變量進行無限制邊界拖動


Demo 影片

先看看最終的效果:

0:00/0:231×


在編輯器下的效果:

0:00/0:291×


Youtube 影片

數學原理

核心的原理如上圖

會有3個主要的物件:

  1. World Space Canvas 下的大地圖

  2. Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界

  3. Camera 的 Viewport

然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport

所以變成這個樣子:

Camera 設定成 Orthographic

接著控制 Camera 的位移和 Size

就可以進行縮放和拖動

(如果是 Perspective 的話就是控制 z 的位置進行縮放)

所以 Inspector 架構會長這個樣子:

有兩個 Canvas

一個是 Overlay Space - 下面有一個觀察視窗的Image

另一個是 World Space - 下面是大地圖

代碼


核心的代碼有四個部分:

  1. MappingUIParameter - 一開始的時候計算邊界數值

  2. Zoom - 處理放大的功能

  3. Drag - 處理拖拽

  4. SnapBoundary - 處理超出邊界的問題

c#


1 - MappingUIParameter

c#

這個代碼主要是用來轉換和計算地圖和觀察視窗在熒幕下的坐標

轉換坐標的代碼:

c#


2 - Zoom

c#

接下來這個是處理 Camera 放大縮小的代碼

核心就是調整 Camera 的 orthographicSize

然後再根據滑鼠的位置來調整 Camera 的位置

實現指哪縮放哪的效果


3 - Drag

c#

這個也比較簡單

當滑鼠中鍵點擊的時候進行位置的記錄

然後根據位移量來移動 Camera 的位置


4 - SnapBoundary

c#

為了不要超出視窗觀察邊界

可以在最後加上這個代碼

讓拖拽的時候容易不會超出去邊界

如果把這個代碼拿掉,就可以實現無邊界拖拽

第一行通過 GetScreenRectOfWorldUI

將地圖在世界上的坐標位置和大小轉換成螢幕空間

然後計算 dx 和 dy (x軸和y軸的偏移量是多少)

再把 Camera 超出的位置位移回去

完整代碼

c#


範例 Unity Package

mapCtlmapCtl.unitypackage5 MB

參考資料

前言


本篇會使用Unity實現地圖拖拽放大的功能

需要實現以下的需求:

  1. 滑鼠滾輪可以放大縮小地圖

  2. 放大縮小時根據滑鼠的位置進行縮放

  3. 點擊滑鼠中鍵可以拖動地圖

  4. 拖動地圖的時候不可以超出地圖邊界

  5. 可以設定變量進行無限制邊界拖動


Demo 影片

先看看最終的效果:

0:00/0:231×


在編輯器下的效果:

0:00/0:291×


Youtube 影片

數學原理

核心的原理如上圖

會有3個主要的物件:

  1. World Space Canvas 下的大地圖

  2. Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界

  3. Camera 的 Viewport

然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport

所以變成這個樣子:

Camera 設定成 Orthographic

接著控制 Camera 的位移和 Size

就可以進行縮放和拖動

(如果是 Perspective 的話就是控制 z 的位置進行縮放)

所以 Inspector 架構會長這個樣子:

有兩個 Canvas

一個是 Overlay Space - 下面有一個觀察視窗的Image

另一個是 World Space - 下面是大地圖

代碼


核心的代碼有四個部分:

  1. MappingUIParameter - 一開始的時候計算邊界數值

  2. Zoom - 處理放大的功能

  3. Drag - 處理拖拽

  4. SnapBoundary - 處理超出邊界的問題

c#


1 - MappingUIParameter

c#

這個代碼主要是用來轉換和計算地圖和觀察視窗在熒幕下的坐標

轉換坐標的代碼:

c#


2 - Zoom

c#

接下來這個是處理 Camera 放大縮小的代碼

核心就是調整 Camera 的 orthographicSize

然後再根據滑鼠的位置來調整 Camera 的位置

實現指哪縮放哪的效果


3 - Drag

c#

這個也比較簡單

當滑鼠中鍵點擊的時候進行位置的記錄

然後根據位移量來移動 Camera 的位置


4 - SnapBoundary

c#

為了不要超出視窗觀察邊界

可以在最後加上這個代碼

讓拖拽的時候容易不會超出去邊界

如果把這個代碼拿掉,就可以實現無邊界拖拽

第一行通過 GetScreenRectOfWorldUI

將地圖在世界上的坐標位置和大小轉換成螢幕空間

然後計算 dx 和 dy (x軸和y軸的偏移量是多少)

再把 Camera 超出的位置位移回去

完整代碼

c#


範例 Unity Package

mapCtlmapCtl.unitypackage5 MB

參考資料