返回





製作地圖拖拽, 放大和邊界限制
前言
本篇會使用Unity實現地圖拖拽放大的功能
需要實現以下的需求:
滑鼠滾輪可以放大縮小地圖
放大縮小時根據滑鼠的位置進行縮放
點擊滑鼠中鍵可以拖動地圖
拖動地圖的時候不可以超出地圖邊界
可以設定變量進行無限制邊界拖動
Demo 影片
先看看最終的效果:
0:00/0:231×
在編輯器下的效果:
0:00/0:291×
Youtube 影片
數學原理

核心的原理如上圖
會有3個主要的物件:
World Space Canvas 下的大地圖
Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界
Camera 的 Viewport
然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport
所以變成這個樣子:

Camera 設定成 Orthographic
接著控制 Camera 的位移和 Size
就可以進行縮放和拖動
(如果是 Perspective 的話就是控制 z 的位置進行縮放)

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

有兩個 Canvas
一個是 Overlay Space - 下面有一個觀察視窗的Image
另一個是 World Space - 下面是大地圖
代碼
核心的代碼有四個部分:
MappingUIParameter - 一開始的時候計算邊界數值
Zoom - 處理放大的功能
Drag - 處理拖拽
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
參考資料
感謝 Cody Clark 的教學分享 - Link
前言
本篇會使用Unity實現地圖拖拽放大的功能
需要實現以下的需求:
滑鼠滾輪可以放大縮小地圖
放大縮小時根據滑鼠的位置進行縮放
點擊滑鼠中鍵可以拖動地圖
拖動地圖的時候不可以超出地圖邊界
可以設定變量進行無限制邊界拖動
Demo 影片
先看看最終的效果:
0:00/0:231×
在編輯器下的效果:
0:00/0:291×
Youtube 影片
數學原理

核心的原理如上圖
會有3個主要的物件:
World Space Canvas 下的大地圖
Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界
Camera 的 Viewport
然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport
所以變成這個樣子:

Camera 設定成 Orthographic
接著控制 Camera 的位移和 Size
就可以進行縮放和拖動
(如果是 Perspective 的話就是控制 z 的位置進行縮放)

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

有兩個 Canvas
一個是 Overlay Space - 下面有一個觀察視窗的Image
另一個是 World Space - 下面是大地圖
代碼
核心的代碼有四個部分:
MappingUIParameter - 一開始的時候計算邊界數值
Zoom - 處理放大的功能
Drag - 處理拖拽
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
參考資料
感謝 Cody Clark 的教學分享 - Link
前言
本篇會使用Unity實現地圖拖拽放大的功能
需要實現以下的需求:
滑鼠滾輪可以放大縮小地圖
放大縮小時根據滑鼠的位置進行縮放
點擊滑鼠中鍵可以拖動地圖
拖動地圖的時候不可以超出地圖邊界
可以設定變量進行無限制邊界拖動
Demo 影片
先看看最終的效果:
0:00/0:231×
在編輯器下的效果:
0:00/0:291×
Youtube 影片
數學原理

核心的原理如上圖
會有3個主要的物件:
World Space Canvas 下的大地圖
Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界
Camera 的 Viewport
然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport
所以變成這個樣子:

Camera 設定成 Orthographic
接著控制 Camera 的位移和 Size
就可以進行縮放和拖動
(如果是 Perspective 的話就是控制 z 的位置進行縮放)

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

有兩個 Canvas
一個是 Overlay Space - 下面有一個觀察視窗的Image
另一個是 World Space - 下面是大地圖
代碼
核心的代碼有四個部分:
MappingUIParameter - 一開始的時候計算邊界數值
Zoom - 處理放大的功能
Drag - 處理拖拽
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
參考資料
感謝 Cody Clark 的教學分享 - Link
前言
本篇會使用Unity實現地圖拖拽放大的功能
需要實現以下的需求:
滑鼠滾輪可以放大縮小地圖
放大縮小時根據滑鼠的位置進行縮放
點擊滑鼠中鍵可以拖動地圖
拖動地圖的時候不可以超出地圖邊界
可以設定變量進行無限制邊界拖動
Demo 影片
先看看最終的效果:
0:00/0:231×
在編輯器下的效果:
0:00/0:291×
Youtube 影片
數學原理

核心的原理如上圖
會有3個主要的物件:
World Space Canvas 下的大地圖
Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界
Camera 的 Viewport
然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport
所以變成這個樣子:

Camera 設定成 Orthographic
接著控制 Camera 的位移和 Size
就可以進行縮放和拖動
(如果是 Perspective 的話就是控制 z 的位置進行縮放)

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

有兩個 Canvas
一個是 Overlay Space - 下面有一個觀察視窗的Image
另一個是 World Space - 下面是大地圖
代碼
核心的代碼有四個部分:
MappingUIParameter - 一開始的時候計算邊界數值
Zoom - 處理放大的功能
Drag - 處理拖拽
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
參考資料
感謝 Cody Clark 的教學分享 - Link
前言
本篇會使用Unity實現地圖拖拽放大的功能
需要實現以下的需求:
滑鼠滾輪可以放大縮小地圖
放大縮小時根據滑鼠的位置進行縮放
點擊滑鼠中鍵可以拖動地圖
拖動地圖的時候不可以超出地圖邊界
可以設定變量進行無限制邊界拖動
Demo 影片
先看看最終的效果:
0:00/0:231×
在編輯器下的效果:
0:00/0:291×
Youtube 影片
數學原理

核心的原理如上圖
會有3個主要的物件:
World Space Canvas 下的大地圖
Overlay View Canvas 下的地圖顯示視窗 - 地圖不可以超出這個顯示邊界
Camera 的 Viewport
然後我把觀察的地圖顯示視窗放大到整個 Camera 的 Viewport
所以變成這個樣子:

Camera 設定成 Orthographic
接著控制 Camera 的位移和 Size
就可以進行縮放和拖動
(如果是 Perspective 的話就是控制 z 的位置進行縮放)

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

有兩個 Canvas
一個是 Overlay Space - 下面有一個觀察視窗的Image
另一個是 World Space - 下面是大地圖
代碼
核心的代碼有四個部分:
MappingUIParameter - 一開始的時候計算邊界數值
Zoom - 處理放大的功能
Drag - 處理拖拽
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
參考資料
感謝 Cody Clark 的教學分享 - Link