使用滑鼠拖曳出選取框,被該框圈住的物件將會視為已選取。
線上玩
範例檔下載 (v2.1) 2017.11.27 更新
範例檔下載 (v1) 2017.11.24 首發
================================================
在撰寫該功能時參考了不少網站的教學,例如:
http://hyunkell.com/blog/rts-style-unit-selection-in-unity-5/
http://www.bendangelo.me/tutorials/rts/2015/12/30/rts-unit-selection-in-unity.html
但他們提供的選取效果並沒有很理想,
因為上面網站提供的選取是要使用者必須圈到【生物的座標點】才算選取,
而真正對使用者更為直覺的應該是判斷是否圈到【生物的碰撞器】。
為了達到這個效果真是花了我超過兩天的時間研究東研究西。
我想了兩個做法:
但是第二種方式有一些優勢存在...也許改天也會試著實做出來吧!
================================================
V2更新內容 2017.11.25:
由於我方式是依照使用者拖曳的位置跟矩形大小動態調整拉3D Box
但這樣做法會有一個風險:當使用者拖拉的範圍太小時會當機 @@b
那我的解決之道就是限制3DBox只會在使用者畫的範圍夠大才更新。
這樣的做法雖然在 Perspective Camera (透視攝影機) *不太會有問題
但是在 Orthographic Camera 卻很容易當機@@
所以我花了整個假日,在想要怎麼解決這問題。
最後生出了V2版本。
在V2版本中 Perspective Camera 跟 Orthographic Camera 將會採用不同的碰撞器。
來避免V1版本中,Orthographic Camera 有機率被玩家搞當機。
已知問題
為什麼說 Perspective Camera 不太會有問題呢?
因為在V1或V2版本中,只要把Perspective Camera 的 Field Of View 參數調低於20以下
還是有機率當機的 ! 不信的話你把 Field Of View 參數 調到1,然後隨便拖拉出選取框
就會當機了~~
我自己認為應該不會有人用了 Perspective Camera,
還要把 Field Of View 參數調低於20以下所以V2版本就這樣放著了。
P.S 2017.12.01:馬上打臉自己...我自己在用的遊戲就有把 Field of View 調到10了...
P.S 所以之後還會有V2.2要更新....
但是如果你莫名其妙的就是有這個需求 你可以把下面的程式碼:
改成下面這樣:
上面的變數Dist 可以自行使用別的浮點數替代,
數值越大表示使用者要拖拉越大範圍,3DBox才會更新。
2.1 發現還是很容易當機,改用成用下列代碼做判斷 (Dist 我用0.1f)
V2心得:
經過這一番折騰後我認為【將轉換生物的Collision成2D資訊,再與選取框做碰撞判斷】
會比我現在這個方法來的簡單而少問題。
V2.1更新內容 2017.11.27:
線上玩
範例檔下載 (v2.1) 2017.11.27 更新
範例檔下載 (v1) 2017.11.24 首發
================================================
在撰寫該功能時參考了不少網站的教學,例如:
http://hyunkell.com/blog/rts-style-unit-selection-in-unity-5/
http://www.bendangelo.me/tutorials/rts/2015/12/30/rts-unit-selection-in-unity.html
但他們提供的選取效果並沒有很理想,
因為上面網站提供的選取是要使用者必須圈到【生物的座標點】才算選取,
而真正對使用者更為直覺的應該是判斷是否圈到【生物的碰撞器】。
為了達到這個效果真是花了我超過兩天的時間研究東研究西。
我想了兩個做法:
- 依照使用者拖拉的選取框,動態產生MeshCollision資料去碰撞場景生物。
- 將轉換生物的Collision成2D資訊 再與選取框做碰撞判斷。
但是第二種方式有一些優勢存在...也許改天也會試著實做出來吧!
================================================
V2更新內容 2017.11.25:
由於我方式是依照使用者拖曳的位置跟矩形大小動態調整拉3D Box
但這樣做法會有一個風險:當使用者拖拉的範圍太小時會當機 @@b
那我的解決之道就是限制3DBox只會在使用者畫的範圍夠大才更新。
這樣的做法雖然在 Perspective Camera (透視攝影機) *不太會有問題
但是在 Orthographic Camera 卻很容易當機@@
所以我花了整個假日,在想要怎麼解決這問題。
最後生出了V2版本。
在V2版本中 Perspective Camera 跟 Orthographic Camera 將會採用不同的碰撞器。
來避免V1版本中,Orthographic Camera 有機率被玩家搞當機。
已知問題
為什麼說 Perspective Camera 不太會有問題呢?
因為在V1或V2版本中,只要把Perspective Camera 的 Field Of View 參數調低於20以下
還是有機率當機的 ! 不信的話你把 Field Of View 參數 調到1,然後隨便拖拉出選取框
就會當機了~~
我自己認為應該不會有人用了 Perspective Camera,
還要把 Field Of View 參數調低於20以下所以V2版本就這樣放著了。
P.S 2017.12.01:馬上打臉自己...我自己在用的遊戲就有把 Field of View 調到10了...
P.S 所以之後還會有V2.2要更新....
但是如果你莫名其妙的就是有這個需求 你可以把下面的程式碼:
if (Mathf.Approximately(sRay.origin.x, eRay.origin.x)) return; if (Mathf.Approximately(sRay.origin.y, eRay.origin.y)) return;
改成下面這樣:
if (Mathf.abs(sRay.origin.x-eRay.origin.x)< Dist) return; if (Mathf.abs(sRay.origin.x-eRay.origin.x)< Dist) return;
數值越大表示使用者要拖拉越大範圍,3DBox才會更新。
2.1 發現還是很容易當機,改用成用下列代碼做判斷 (Dist 我用0.1f)
if (Mathf.abs(SelectFrameTransform.position.x-Input.mousePosition.x)< Dist) return; if (Mathf.abs(SelectFrameTransform.position.y-Input.mousePosition.y)< Dist) return;
V2心得:
經過這一番折騰後我認為【將轉換生物的Collision成2D資訊,再與選取框做碰撞判斷】
會比我現在這個方法來的簡單而少問題。
V2.1更新內容 2017.11.27:
- 修正、調整部分變數與Calss的命名 (我很不擅長這個,請大家給我建議)
- 修正在Perspective 模式下當機的問題。
- 修正 Orthographic Camera下,更新SelectBox旋轉值的時機。
沒有留言:
張貼留言